TypeScript o JavaScript tipo casting


185

¿Cómo se maneja la conversión de tipos en TypeScript o Javascript?

Digamos que tengo el siguiente código TypeScript:

module Symbology { 

    export class SymbolFactory { 

        createStyle( symbolInfo : SymbolInfo) : any { 
            if (symbolInfo == null)
            {
                 return null;
            }

            if (symbolInfo.symbolShapeType === "marker") {      

                // how to cast to MarkerSymbolInfo          
                return this.createMarkerStyle((MarkerSymbolInfo) symbolInfo);
            }                                  
        }

        createMarkerStyle(markerSymbol : MarkerSymbolInfo ): any { 
            throw "createMarkerStyle not implemented";
        }              

    }
}

donde SymbolInfoes una clase base ¿Cómo manejo la conversión de tipos de SymbolInfoa MarkerSymbolInfoen TypeScript o Javascript?

Respuestas:


284

Puedes emitir así:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

O así si quieres ser compatible con el modo tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Solo recuerda que este es un elenco en tiempo de compilación, y no un elenco en tiempo de ejecución.


10
Ahora, veo eso en el documento, denominado aserciones de tipo en la sección 4.13.
— Klaus Nji

Esta respuesta ya no proporciona la imagen completa de la aserción de tipo en mecanografiado, mientras que la respuesta de Alex ofrece una imagen más completa, y debería ser la respuesta aceptada.
— Kristoffer Dorph

@KristofferDorph Esta respuesta tiene 4 años. Al momento de escribir, TypeScript se encontraba en la versión 0.8.1 y, por lo tanto, era la respuesta correcta en ese momento. El soporte de JSX solo se incluyó 3 años después.
— blorkfish el

@blorkfish es cierto, pero es una buena práctica seguir los tiempos, por lo que las personas que hacen la misma pregunta hoy obtienen la respuesta actual, y no como donde hace 4 años :-)
— Kristoffer Dorph

160

Esto se llama aserción de tipo en TypeScript, y desde TypeScript 1.6, hay dos formas de expresar esto:

// Original syntax
var markerSymbolInfo = <MarkerSymbolInfo> symbolInfo;

// Newer additional syntax
var markerSymbolInfo = symbolInfo as MarkerSymbolInfo;

Ambas alternativas son funcionalmente idénticas . La razón para introducir la assintaxis es que la sintaxis original está en conflicto con JSX , vea la discusión de diseño aquí .

Si está en condiciones de elegir, simplemente use la sintaxis con la que se sienta más cómodo. Personalmente prefiero la assintaxis, ya que se siente más fluido para leer y escribir.


2
¿Cómo le indica al mecanografiado que ha convertido un objeto a otro tipo? Por ejemplo, un func que devuelve type2, dentro de él http obtiene type 1, hace la lógica para convertir y devuelve lo que era type1 pero ahora es type2?
— Tony Gutiérrez

@TonyGutierrez ¿Cómo se hace la conversión?
— Alex

1
Básicamente tome una propiedad y modifíquela. La única forma en que he encontrado para hacer esto es crear una nueva var (type2) y copiar los accesorios del type1var y luego devolverlo. No puede modificar el tipo1 y regresar, u obtiene un error "No se puede emitir".
— Tony Gutiérrez

1

En mecanografiado es posible hacer una instanceofverificación en una declaración if y tendrá acceso a la misma variable con las Typedpropiedades.

Entonces, digamos que MarkerSymbolInfotiene una propiedad llamada marker. Puedes hacer lo siguiente:

if (symbolInfo instanceof MarkerSymbol) {
    // access .marker here
    const marker = symbolInfo.marker
}

Es un buen truco obtener la instancia de una variable usando la misma variable sin necesidad de reasignarla a un nombre de variable diferente.

Consulte estos dos recursos para obtener más información:

TypeScript instanceof & JavaScript instanceof

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.