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)
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)
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
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.
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[];
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.
x => Objekt.schlüssel (foo) –