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