Co się dzieje
Problem polega na tym, że instanceof
jest to konstrukcja z JavaScript, aw JavaScript instanceof
oczekuje wartości dla operandu po prawej stronie. W szczególności w x instanceof Foo
JavaScript przeprowadzi sprawdzenie w czasie wykonywania, aby sprawdzić, czy Foo.prototype
istnieje gdziekolwiek w łańcuchu prototypów x
.
Jednak w TypeScript interface
s nie emitują. Oznacza to, że ani Foo
nie Foo.prototype
istnieje w czasie wykonywania, więc ten kod na pewno zawiedzie.
TypeScript próbuje ci powiedzieć, że to nigdy nie zadziała. Foo
to tylko typ, to wcale nie jest wartość!
„Co mogę zamiast tego zrobić instanceof
?”
Możesz zajrzeć do zabezpieczeń typów i zabezpieczeń typów zdefiniowanych przez użytkownika .
- A co, jeśli właśnie przełączyłem się z an interface
na a class
?
Możesz pokusić się o przejście z a interface
na a class
, ale powinieneś zdać sobie sprawę, że w systemie typów strukturalnych TypeScript (gdzie rzeczy są głównie oparte na kształtach ), możesz utworzyć dowolny obiekt, który ma taki sam kształt jak dana klasa:
class C {
a: number = 10;
b: boolean = true;
c: string = "hello";
}
let x = new C()
let y = {
a: 10, b: true, c: "hello",
}
x = y;
y = x;
W tym przypadku masz x
i y
mają ten sam typ, ale jeśli spróbujesz użyć instanceof
jednego z nich, uzyskasz odwrotny wynik na drugim. Więc instanceof
tak naprawdę nie powie ci zbyt wiele o typie, jeśli korzystasz z typów strukturalnych w TypeScript.
Foo | string
.