type array javascript typescript instanceof

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.