Що відбувається
Проблема в тому, що instanceofконструкція з JavaScript і в JavaScript instanceofочікує значення для правого операнда. Зокрема, в x instanceof FooJavaScript буде виконана перевірка часу виконання, щоб побачити, чи Foo.prototypeіснує де-небудь у ланцюжку прототипів x.
Однак у TypeScript interfaces не мають випромінювання. Це означає, що ні, Fooні Foo.prototypeіснує під час виконання, тому цей код точно не вдасться.
TypeScript намагається сказати вам, що це ніколи не могло спрацювати. Fooце просто тип, це зовсім не цінність!
"Що я можу зробити замість цього instanceof?"
Ви можете ознайомитись із захисниками типу та типовими захисами користувача .
"Але що, якби я просто перейшов з" interface на class"?"
У вас може виникнути спокуса перейти з a interfaceна a class, але ви повинні усвідомити, що в структурній системі типів TypeScript (де речі в основному засновані на фігурі ) ви можете створити будь-який об'єкт, який має таку ж форму, що і даний клас:
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;
У цьому випадку у вас є xі ті, yщо мають однаковий тип, але якщо ви спробуєте скористатися instanceofодним із них, ви отримаєте протилежний результат з іншого. Тож насправдіinstanceof не розповість вам багато про тип, якщо ви користуєтесь структурними типами в TypeScript.
Foo | string.