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?

Klaus Nji
fuente

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.

blorkfish
fuente
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.

Alex
fuente
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

Desarrollador Newteq
fuente