TypeScript- oder JavaScript-Typumwandlung

183

Wie geht man mit Type Casting in TypeScript oder Javascript um?

Angenommen, ich habe den folgenden TypeScript-Code:

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";
        }              

    }
}

Wo SymbolInfoist eine Basisklasse? Wie gehe ich mit Typecasting von SymbolInfobis MarkerSymbolInfoin TypeScript oder Javascript um?

Klaus Nji
quelle

Antworten:

283

Sie können wie folgt besetzen:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Oder so, wenn Sie mit dem tsx-Modus kompatibel sein möchten:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Denken Sie daran, dass dies eine Umwandlung zur Kompilierungszeit und keine Laufzeitbesetzung ist.

Blorkfish
quelle
10
Jetzt sehe ich das in doc, das in Abschnitt 4.13 als Typzusicherungen bezeichnet wird.
Klaus Nji
Diese Antwort liefert nicht mehr das vollständige Bild der Typzusicherung in Typoskript, während Alex 'Antwort ein vollständigeres Bild liefert und die akzeptierte Antwort sein sollte.
Kristoffer Dorph
@KristofferDorph Diese Antwort ist 4 Jahre alt. Zum Zeitpunkt des Schreibens befand sich TypeScript in Version 0.8.1 und war daher zu diesem Zeitpunkt die richtige Antwort. JSX-Unterstützung wurde erst 3 Jahre später aufgenommen.
Blorkfish
@blorkfish das ist wahr, aber es ist eine gute Praxis, die Zeiten zu befolgen, so dass Leute, die heute die gleiche Frage stellen, die aktuelle Antwort erhalten, und nicht wie vor 4 Jahren :-)
Kristoffer Dorph
159

Dies wird als Typ Behauptung in Typoskript, und da Typoskript 1.6, gibt es zwei Möglichkeiten , dies zum Ausdruck zu bringen:

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

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

Beide Alternativen sind funktional identisch . Der Grund für die Einführung der as-syntax ist, dass die ursprüngliche Syntax mit JSX in Konflikt steht. Siehe die Designdiskussion hier .

Wenn Sie in der Lage sind zu wählen, verwenden Sie einfach die Syntax, mit der Sie sich wohler fühlen. Ich persönlich bevorzuge die as-Ssyntax, da das Lesen und Schreiben fließender ist.

Alex
quelle
2
Wie zeigen Sie dem Typoskript an, dass Sie ein Objekt in einen anderen Typ konvertiert haben? Zum Beispiel eine Funktion, die Typ2 zurückgibt, in der http http Typ 1 erhält, die Logik konvertiert und zurückgibt, was Typ1 war, jetzt aber Typ2 ist?
Tony Gutierrez
@ TonyGutierrez Wie machst du die Konvertierung?
Alex
1
Grundsätzlich nehmen Sie eine Eigenschaft und ändern. Die einzige Möglichkeit, die ich gefunden habe, besteht darin, eine neue Variable (Typ2) zu erstellen, die Requisiten von Typ1var zu kopieren und sie dann zurückzugeben. Sie können den Typ1 nicht ändern und zurückkehren, oder es wird der Fehler "Kann nicht gewirkt" angezeigt.
Tony Gutierrez