Що відбувається
Проблема в тому, що instanceof
конструкція з JavaScript і в JavaScript instanceof
очікує значення для правого операнда. Зокрема, в x instanceof Foo
JavaScript буде виконана перевірка часу виконання, щоб побачити, чи Foo.prototype
існує де-небудь у ланцюжку прототипів x
.
Однак у TypeScript interface
s не мають випромінювання. Це означає, що ні, 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
.