¿Qué hace la palabra clave `is` en mecanografiado?
Encontré un código que se parece a este:
export function foo(arg: string): arg is MyType {
return ...
}
No he podido buscar is
ni en los documentos ni en Google, es una palabra bastante común y aparece básicamente en todas las páginas.
¿Qué hace la palabra clave en ese contexto?
Consulte la referencia de funciones de protección de tipo definidas por el usuario para obtener más información.
function isString(test: any): test is string{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
}
example("hello world");
Usando el predicado de tipo test is string
en el formato anterior (en lugar de solo usarlo boolean
para el tipo de retorno), después isString()
de llamar, si la función devuelve true
, TypeScript limitará el tipo a string
cualquier bloque protegido por una llamada a la función.
El compilador pensará que foo
está string
en el bloque debajo protegido (y SÓLO en el bloque debajo protegido)
{
console.log("it is a string" + foo);
console.log(foo.length); // string function
}
Un predicado de tipo solo se usa en tiempo de compilación. El .js
archivo resultante (tiempo de ejecución) no tendrá diferencia porque no considera el TIPO.
Ilustraré las diferencias en los siguientes cuatro ejemplos.
Ejemplo 1: el código de ejemplo anterior no tendrá un error de compilación ni un error de tiempo de ejecución.
Ejemplo 2: el siguiente código de ejemplo tendrá un error de compilación (así como un error de tiempo de ejecución) porque TypeScript ha reducido el tipo string
y comprobado que toExponential
no pertenece al string
método.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
Ejemplo 3: el siguiente código de ejemplo no tiene un error de compilación, pero tendrá un error de tiempo de ejecución porque TypeScript SÓLO limitará el tipo al string
bloque protegido pero no después, por lo tanto, foo.toExponential
no creará un error de compilación (TypeScript no cree que sea un string
tipo ). Sin embargo, en tiempo de ejecución, string
no tiene el toExponential
método, por lo que tendrá un error de tiempo de ejecución.
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
}
console.log(foo.toExponential(2));
}
Ejemplo 4: si no usamos test is string
(predicado de tipo), TypeScript no limitará el tipo en el bloque protegido y el siguiente código de ejemplo no tendrá un error de compilación, pero sí un error de tiempo de ejecución.
function isString(test: any): boolean{
return typeof test === "string";
}
function example(foo: any){
if(isString(foo)){
console.log("it is a string" + foo);
console.log(foo.length);
console.log(foo.toExponential(2));
}
}
La conclusión es que test is string
(tipo predicado) se utiliza en tiempo de compilación para indicar a los desarrolladores que el código tendrá la posibilidad de tener un error de tiempo de ejecución. Para javascript, los desarrolladores NO SABEN el error en tiempo de compilación. Ésta es la ventaja de usar TypeScript.
El único uso que conozco es el de su ejemplo: especificar un "predicado de tipo" ( arg is MyType
) en un Type Guard definido por el usuario
Consulte Protectores de tipo definidos por el usuario en esta referencia
Aquí hay otra referencia.