microsoft / microsoft/TypeScript
keyof of 'mixed' class equals to `string | number`
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.4k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
TypeScript Version: 3.4.3 or 3.5.0-dev.20190427
Search Terms: keyof, anonymous class
Code
type AnyClass = new (...args: any[]) => any;
const mixin = <T extends AnyClass>(Class: T) => class extends Class {a: string};
const Cl = mixin(class {b = 123});
const inst = new Cl();
inst. // <- IntelliSense works fine here and suggests 'a' and 'b' properties
type Keys = keyof typeof inst; // Keys = string | number
Expected behavior:
Keys to be equal to 'a' | 'b'
Actual behavior:
Keys to be equal to string | number
Playground Link: ts-playground
Description:
I'm sorry if that is a known bug ot expected behaviour. I did not find a duplicate.
Class C is a result of extension of some other class A provided as a function argument and class B which is declared inside the function body. Such class C works fine for the most part, but keyof InstanceType<typeof C> returns string | number.

While IntelliSense works fine:

I'll be glad if you suggest any workarounds for this issue.
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne damit, das Beispiel im verlinkten TypeScript Playground mit den gemeldeten Versionen zu reproduzieren, und bestätige den inferierten Typ von keyof typeof inst. Verfolge die Verarbeitung von keyof durch den Compiler für die gemischte anonyme Klasse und füge Testabdeckung für das Beispiel hinzu, sodass das Ergebnis 'a' | 'b' statt string | number ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 35/100