Ответ 1
Что происходит
Проблема в том, что instanceof
является конструкцией из JavaScript, а в JavaScript instanceof
ожидает значение для правого операнда. В частности, в x instanceof Foo
JavaScript выполнит проверку во время выполнения, чтобы увидеть, существует ли Foo.prototype
где-нибудь в цепочке прототипов x
.
Тем не менее, в TypeScript interface
не имеет излучения. Это означает, что ни Foo
ни Foo.prototype
существуют во время выполнения, поэтому этот код определенно потерпит неудачу.
TypeScript пытается сказать вам, что это никогда не сработает. Foo
это просто тип, это не значение вообще!
"Что я могу сделать вместо instanceof
?"
Вы можете посмотреть на охрану типов и определяемые пользователем охранники типов.
"Но что, если я просто переключился с interface
на class
?"
Вы можете испытать желание переключиться с interface
на 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",
}
// Works!
x = y;
y = x;
В этом случае у вас есть x
и y
одинакового типа, но если вы попытаетесь использовать instanceof
для одного из них, вы получите противоположный результат для другого. Таким образом, instanceof
мало что скажет вам о типе, если вы используете преимущества структурных типов в TypeScript.