Cast di tipo TypeScript o JavaScript


185

Come si fa a gestire il cast dei tipi in TypeScript o Javascript?

Supponiamo di avere il seguente codice 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";
        }              

    }
}

dove SymbolInfoè una classe base. Come gestisco il typecasting da SymbolInfoa MarkerSymbolInfoin TypeScript o Javascript?

Risposte:


284

Puoi lanciare in questo modo:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

O così se vuoi essere compatibile con la modalità tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Ricorda solo che si tratta di un cast in fase di compilazione e non di un cast di runtime.


10
Ora, vedo che nel documento, indicato come Asserzioni di tipo nella sezione 4.13.
Klaus Nji,

Questa risposta non fornisce più il quadro completo dell'asserzione di tipo in dattiloscritto, mentre la risposta di Alex fornisce un quadro più completo e dovrebbe essere la risposta accettata.
Kristoffer Dorph,

@KristofferDorph Questa risposta ha 4 anni. Al momento della stesura di TypeScript era alla versione 0.8.1, e quindi era la risposta corretta al momento. Il supporto JSX è stato incluso solo 3 anni dopo.
Blorkfish,

@blorkfish è vero, ma è buona norma seguire i tempi, quindi le persone che fanno la stessa domanda oggi ottengono la risposta attuale, e non come dove 4 anni fa :-)
Kristoffer Dorph,

160

Questo si chiama asserzione di tipo in TypeScript e, a partire da TypeScript 1.6, esistono due modi per esprimerlo:

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

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

Entrambe le alternative sono funzionalmente identiche . Il motivo per introdurre la assintassi è che la sintassi originale è in conflitto con JSX , vedere la discussione di progettazione qui .

Se sei nella posizione di scegliere, usa semplicemente la sintassi con cui ti senti più a tuo agio. Personalmente preferisco la assintassi in quanto sembra più fluente leggere e scrivere.


2
Come indichi a dattiloscritto che hai convertito un oggetto in un altro tipo? Ad esempio una funzione che restituisce type2, al suo interno http ottiene il tipo 1, fa la logica da convertire e restituisce ciò che era type1 ma ora è type2?
Tony Gutierrez,

@TonyGutierrez Come si fa la conversione?
Alex,

1
Praticamente prendere una proprietà e modificarla. L'unico modo che ho trovato per farlo è creare un nuovo var (tipo2) e copiarlo negli oggetti di scena da type1var e poi restituirlo. Non è possibile modificare il tipo1 e restituire, oppure viene visualizzato l'errore "Impossibile eseguire il cast".
Tony Gutierrez,

1

In dattiloscritto è possibile effettuare un instanceofcheck in un'istruzione if e si avrà accesso alla stessa variabile con ilTyped proprietà.

Quindi diciamo che MarkerSymbolInfoha una proprietà chiamata marker. Puoi fare quanto segue:

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

È un piccolo trucco per ottenere l'istanza di una variabile usando la stessa variabile senza bisogno di riassegnarla a un nome di variabile diverso.

Dai un'occhiata a queste due risorse per ulteriori informazioni:

Tipo di istanza diScript e istanza di JavaScript

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.