Co się dzieje
Problem polega na tym, że instanceofjest to konstrukcja z JavaScript, aw JavaScript instanceofoczekuje wartości dla operandu po prawej stronie. W szczególności w x instanceof FooJavaScript przeprowadzi sprawdzenie w czasie wykonywania, aby sprawdzić, czy Foo.prototypeistnieje gdziekolwiek w łańcuchu prototypów x.
Jednak w TypeScript interfaces nie emitują. Oznacza to, że ani Foonie Foo.prototypeistnieje w czasie wykonywania, więc ten kod na pewno zawiedzie.
TypeScript próbuje ci powiedzieć, że to nigdy nie zadziała. Footo 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 interfacena 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 xi ymają ten sam typ, ale jeśli spróbujesz użyć instanceofjednego z nich, uzyskasz odwrotny wynik na drugim. Więc instanceoftak naprawdę nie powie ci zbyt wiele o typie, jeśli korzystasz z typów strukturalnych w TypeScript.
Foo | string.