javascript - array - typescript map
¿Por qué ''instanceof'' en TypeScript me da el error "''Foo'' solo se refiere a un tipo, pero se está utilizando como un valor aquí"? (1)
Que esta pasando
El problema es que instanceof
es una construcción de JavaScript, y en JavaScript, instanceof
espera un valor para el operando del lado derecho. Específicamente, en x instanceof Foo
JavaScript realizará una verificación de tiempo de ejecución para ver si Foo.prototype
existe en Foo.prototype
lugar de la cadena de prototipos de x
.
Sin embargo, en TypeScript, las interface
no tienen emisión. Eso significa que ni Foo
ni Foo.prototype
existen en tiempo de ejecución, por lo que este código definitivamente fallará.
TypeScript está tratando de decirte que esto nunca podría funcionar. Foo
es solo un tipo, no es un valor en absoluto!
"¿Qué puedo hacer en lugar de instanceof
?"
Puede buscar en guardias de tipo y guardas de tipo definido por el usuario .
"¿Pero qué pasa si acabo de cambiar de una interface
a una class
?"
Puede sentirse tentado a cambiar de una interface
a una class
, pero debe darse cuenta de que en el sistema de tipo estructural de TypeScript (donde las cosas se basan principalmente en la forma ), puede producir cualquier objeto que tenga la misma forma que una clase dada:
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;
En este caso, tiene y
que tienen el mismo tipo, pero si intenta usar instanceof
en cualquiera de los dos, obtendrá el resultado opuesto en el otro. Así que instanceof
realmente no le dirá mucho sobre el tipo si está aprovechando los tipos estructurales en TypeScript.
Yo escribi este codigo
interface Foo {
abcdef: number;
}
let x: Foo | string;
if (x instanceof Foo) {
// ...
}
Pero TypeScript me dio este error:
''Foo'' only refers to a type, but is being used as a value here.
¿Por qué está pasando esto? Pensé que instanceof
podría comprobar si mi valor tiene un tipo dado, pero parece que a TypeScript no le gusta esto.