Co się dzieje
Problem jest, że instanceof
jest konstruktem z JavaScript, a w JavaScript, instanceof
oczekuje wartości dla argumentu po prawej stronie. W szczególności w języku x instanceof Foo
JavaScript wykona kontrolę w czasie wykonywania, aby sprawdzić, czy Foo.prototype
istnieje w dowolnym miejscu w prototypowym łańcuchu x
.
Jednak w TypeScript, interface
s nie emitują. Oznacza to, że Foo.prototype
nie istnieje w środowisku wykonawczym, więc ten kod na pewno się nie powiedzie.
TypeScript próbuje dać ci tam ostrzeżenie: Foo
to tylko typ; to nie jest żadna wartość!
"Co mogę zrobić zamiast instanceof
?"
Możesz zajrzeć do type guards and user-defined type guards.
"Ale co, jeśli po prostu przełączyłem z interface
na class
?"
może ulec pokusie, aby przełączyć się z interface
do class
, ale należy zdać sobie sprawę, że w systemie typu strukturalnego maszynopis w (gdzie rzeczy są przede wszystkim kształt oparty) można produkować każdy 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",
}
// Works!
x = y;
y = x;
W tym przypadku, trzeba x
i y
, które mają ten sam typ, ale jeśli spróbuj instanceof
na jeden z nich, dostaniesz odwrotny skutek na drugiej. Tak więc instanceof
nie będzie naprawdę powiedzieć wiele o typie, jeśli korzystasz z typów strukturalnych w TypeScript.
Zobacz odpowiedź poniżej @ 4castle. W przeciwnym razie masz rację, zrobię to 'Foo | string'. –
Możliwy duplikat [sprawdzania typu interfejsu za pomocą maszynopisu] (https://stackoverflow.com/questions/14425568/interface-type-check-with-typescript) – Cerbrus
I możliwy duplikat [Sprawdź, czy zmienna jest określonym typem interfejsu w maszynopisarstwo] (https://stackoverflow.com/questions/29172486/check-if-variable-is-a-specific-interface-type-in-a-typescript-union) (nie bardzo chcę pojedynczo własnoręcznie to wymusić) – Cerbrus