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.