microsoft / microsoft/TypeScript

Type can't `keyof`

Offen
#56,871 6 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Needs Investigation
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔎 Search Terms
  • keyof
🕗 Version & Regression Information
  • This is a crash
⏯ Playground Link

No response

💻 Code
export type IsEqual<A, B> =
  (<T>() => T extends A ? 1 : 2) extends
  (<T>() => T extends B ? 1 : 2) ? true : false

export type IsNotEqual<A, B> =
  (<T>() => T extends A ? 1 : 2) extends
  (<T>() => T extends B ? 1 : 2) ? false : true

export interface Entries<X> {
  100000: [true extends (
    & IsNotEqual<X, ArrayConstructor>
    // Simplifying the problem here allows for the removal of the next line.
    & ([X] extends [ObjectConstructor] ? true : false)
  ) ? true : false, {
    check: (
      & IsNotEqual<X, ArrayConstructor>
      & ([X] extends [ObjectConstructor] ? true : false)
    ),
    x: X
  }]
  [key: number & {}]: [boolean, any]
}
type Mapping<
  X,
  E extends Entries<X> = Entries<X>
> = {
  [ K in keyof E
      as true extends (
        IsEqual<E[K & number][0], true>
      ) ? K : never
  ]: E[K & number][1]
}
type A0 = keyof Mapping<ObjectConstructor>
//   ^? type A0 = 100000
type A1 = ObjectConstructor extends infer T ? Mapping<T> : never
//   ^? type A1 = { 10000: { check: true; x: ObjectConstructor } }
type A2 = ObjectConstructor extends infer T ? keyof Mapping<T> : never
//   ^? type A2 = never
type A3 = [ObjectConstructor] extends [infer T] ? keyof Mapping<T> : never
//   ^? type A3 = never
type A4 = keyof (ObjectConstructor extends infer T ? Mapping<T> : never)
//   ^? type A4 = 11000
Output
export {};
//   ^?

Compiler Options
{
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "strictFunctionTypes": true,
    "strictPropertyInitialization": true,
    "strictBindCallApply": true,
    "noImplicitThis": true,
    "noImplicitReturns": true,
    "alwaysStrict": true,
    "esModuleInterop": true,
    "declaration": true,
    "target": "ES2017",
    "jsx": "react",
    "module": "ESNext",
    "moduleResolution": "node"
  }
}

Playground Link: Provided

🙁 Actual behavior

In the case of A2, the type obtained through the operation cannot be used with keyof to obtain the Keys of the corresponding type.

🙂 Expected behavior
type A2 = 11000
Additional information about the issue

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit der bereitgestellten TypeScript Playground-Reproduktion und vergleiche A2 mit A0–A4, wobei der Fokus auf der keyof-Auswertung für die gezeigten bedingten und gemappten Typen liegt. Erledigt ist die Aufgabe, wenn der Absturz behoben ist und A2 zu 11000 ausgewertet wird, ohne das erwartete Verhalten der benachbarten Beispiele zu ändern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
compilers
Issue-Typ
Bug
Schwierigkeit
5/5
Geschätzter Aufwand
Über eine Woche
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
30/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.