Cosa sta succedendo
Il problema è che instanceofè un costrutto di JavaScript e, in JavaScript, si instanceofaspetta un valore per l'operando di destra. In particolare, in x instanceof FooJavaScript eseguirà un controllo in fase di esecuzione per vedere se Foo.prototypeesiste ovunque nella catena di prototipi di x.
Tuttavia, in TypeScript, interfaces non hanno emit. Ciò significa che né Fooné Foo.prototypeesistono in fase di esecuzione, quindi questo codice fallirà sicuramente.
TypeScript sta cercando di dirti che questo non potrebbe mai funzionare. Fooè solo un tipo, non è affatto un valore!
"Cosa posso fare invece di instanceof?"
Puoi esaminare protezioni dei tipi e quelle definite dall'utente .
"Ma cosa succederebbe se passassi da an interface a aclass ?"
Potresti essere tentato di passare da a interfacea a class, ma dovresti renderti conto che nel sistema di tipi strutturali di TypeScript (dove le cose sono principalmente basate sulla forma ), puoi produrre qualsiasi oggetto che abbia la stessa forma di una data classe:
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;
In questo caso, hai xe yhai lo stesso tipo, ma se provi a usarli instanceofsu uno dei due, otterrai il risultato opposto sull'altro. Quindi instanceofnon sarà davvero dirvi molto circa il tipo se si sta approfittando di tipologie strutturali a macchina.
Foo | string.