Что происходит
Проблема в том, что instanceofэто конструкция из JavaScript, а в JavaScript instanceofожидает значение для правого операнда. В частности, в x instanceof FooJavaScript выполняется проверка времени выполнения, чтобы увидеть, Foo.prototypeсуществует ли где-нибудь в цепочке прототипов x.
Однако в TypeScript у interfaces нет emit. Это означает, что во время выполнения 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.