2017-01-03 12 views
1

Kann mir jemand erklären, warum dies:keyof Foo vs Object.keys (Foo)

let foo = new Foo(), 
    x: (keyof Foo)[] = Object.keys(foo) 

zu führt:

Typ 'string []' eingeben nicht belegbar ist ‚ "bar" | "Bar1" ...‘

(Mit tsc 2.1.4)

+0

x = > Objekt.schlüssel (foo) –

Antwort

0

Ich glaube, dies ist aufgrund der Tatsache, dass keyof Operator im Typ Deklaration Raum arbeitet, während Object.keys gibt Ihnen die Variable, die aus Variable Deklaration Raum ist. Und Sie können nicht einfach Werte aus verschiedenen Räumen einander zuweisen.

Mehr zu diesem Thema: spaces

+0

Aber sollte Foo nicht im Variablenraum sein, da es eine Klasse ist? – roemer

+1

Nein, da es sich um eine Klasse handelt - sie befindet sich im Deklarationsbereich, da sie den Typ der Daten "deklariert". Auf der anderen Seite wird die Instanz von Foo im variablen Raum sein. – Amid

0

Verfahren Object.keys(...) ein Array von Strings zurück:

class Foo { 
    public foo: string; 
    public bar: string; 
} 

let foo = new Foo(), 
    x: string[] = Object.keys(foo) 

Typoskript nicht vollständig bewerten, was das Ergebnis der Object.keys wird sein, um die Werte zu garantieren, werden die richtigen sein ... obwohl man sehen kann, dass sie in diesem Beispiel kompatibel sein wird ...

type example = keyof Foo; // "foo", "bar" 

So ist Ihre Typ-Annotation in Ihrem ursprünglichen Beispiel korrekt, aber TypeScript gibt dem Object.keys-Ergebnis keinen solchen spezifischen Typ.

0

Sie geben es behaupten kann und dann ist es in Ordnung:

class Foo { 
    x: number; 
    y: number; 
} 

type Keys = keyof Foo; 

let foo = new Foo(), 
    x = Object.keys(foo) as Keys[]; 

(code in playground)

Das Problem ist, dass Sie versuchen, string[] in setzen (in meinem Beispiel) ('x' | 'y')[] was spezifischer ist.
Das gleiche wird hier geschehen:

interface A { 
    x: number; 
} 

interface B extends A { 
    y: number; 
} 

let a: A = { x: 5 }; 
let b1: B = a; // error 
let b2: B = a as B; // fine 

Wenn Sie etwas in eine bestimmte Art machen wollen, dann müssen Sie den Compiler sagen, dass Sie wissen, was Sie nach Art machen es zu behaupten.

Verwandte Themen