¿Qué hace la palabra clave `is` en mecanografiado?

Resuelto Drew asked hace 8 años • 2 respuestas

Encontré un código que se parece a este:

export function foo(arg: string): arg is MyType {
    return ...
}

No he podido buscar isni 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?

Drew avatar Oct 17 '16 15:10 Drew
Aceptado

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 stringen el formato anterior (en lugar de solo usarlo booleanpara el tipo de retorno), después isString()de llamar, si la función devuelve true, TypeScript limitará el tipo a stringcualquier bloque protegido por una llamada a la función. El compilador pensará que fooestá stringen 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 .jsarchivo 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 stringy comprobado que toExponentialno pertenece al stringmé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 stringbloque protegido pero no después, por lo tanto, foo.toExponentialno creará un error de compilación (TypeScript no cree que sea un stringtipo ). Sin embargo, en tiempo de ejecución, stringno tiene el toExponentialmé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.

ARIES CHUI avatar Aug 18 '2017 04:08 ARIES CHUI

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.

Bruno Grieder avatar Oct 17 '2016 09:10 Bruno Grieder