Przesyłanie czcionek TypeScript lub JavaScript

185

Jak obsługuje się rzutowanie tekstu w TypeScript lub JavaScript?

Powiedz, że mam następujący kod 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";
        }              

    }
}

gdzie SymbolInfojest klasa podstawowa. Jak obsługiwać rzutowanie typu od SymbolInfodo MarkerSymbolInfow TypeScript lub JavaScript?

Klaus Nji
źródło

Odpowiedzi:

284

Możesz rzucić w ten sposób:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Lub jeśli chcesz być kompatybilny z trybem TSX:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Pamiętaj tylko, że jest to rzutowanie w czasie kompilacji, a nie rzutowanie w czasie wykonywania.

blorkfish
źródło
10
Teraz widzę to w dokumencie, określanym jako Asercje typu w sekcji 4.13.
Klaus Nji,
Ta odpowiedź nie zapewnia już pełnego obrazu asercji w maszynopisie, podczas gdy odpowiedź Alexa daje pełniejszy obraz i powinna być odpowiedzią akceptowaną.
Kristoffer Dorph
@KristofferDorph Ta odpowiedź ma 4 lata. W momencie pisania TypeScript był w wersji 0.8.1, a zatem była poprawną odpowiedzią w tym czasie. Obsługa JSX została uwzględniona dopiero 3 lata później.
blorkfish
@blorkfish to prawda, ale dobrą praktyką jest podążanie za czasami, więc ludzie zadający dziś to samo pytanie otrzymują aktualną odpowiedź, a nie tak, jak 4 lata temu :-)
Kristoffer Dorph
160

Nazywa się to asercją typu w TypeScript, a od TypeScript 1.6 istnieją dwa sposoby na wyrażenie tego:

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

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

Obie alternatywy są funkcjonalnie identyczne . Powodem wprowadzenia as-syntax jest konflikt oryginalnej oryginalnej składni z JSX , patrz dyskusja projektowa tutaj .

Jeśli jesteś w stanie dokonać wyboru, po prostu skorzystaj ze składni, w której czujesz się bardziej komfortowo. Osobiście wolę as-syntax, ponieważ czytanie i pisanie jest bardziej płynne.

Alex
źródło
2
Jak wskazujesz maszynopisowi, że dokonałeś konwersji obiektu na inny typ? Na przykład func, który zwraca typ2, w nim http dostaje typ 1, logikę do konwersji i zwraca to, co było typem 1, ale teraz jest typem 2?
Tony Gutierrez
@TonyGutierrez Jak przeprowadzić konwersję?
Alex
1
Zasadniczo weź jedną właściwość i zmodyfikuj. Jedynym sposobem, jaki to zrobiłem, jest utworzenie nowego var (typ2) i skopiowanie rekwizytów z type1var, a następnie zwrócenie go. Nie możesz zmodyfikować typu 1 i powrócić, lub pojawia się błąd „Nie można rzutować”.
Tony Gutierrez
1

W maszynopisie można wykonać instanceofsprawdzenie instrukcji if i będziesz mieć dostęp do tej samej zmiennej z Typedwłaściwościami.

Powiedzmy, że MarkerSymbolInfoma właściwość o nazwie marker. Możesz wykonać następujące czynności:

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

Miłą sztuczką jest uzyskanie wystąpienia zmiennej przy użyciu tej samej zmiennej bez konieczności ponownego przypisywania jej do innej nazwy zmiennej.

Sprawdź te dwa zasoby, aby uzyskać więcej informacji:

Instancja TypeScript i Instancja JavaScript

Deweloper Newteq
źródło