Conversão de tipo TypeScript ou JavaScript

185

Como lidar com a conversão de tipos em TypeScript ou Javascript?

Digamos que eu tenha o seguinte 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";
        }              

    }
}

onde SymbolInfoé uma classe base. Como lidar com SymbolInfoa MarkerSymbolInfoconversão de tipos de para em TypeScript ou Javascript?

Klaus Nji
fonte

Respostas:

284

Você pode transmitir assim:

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

Ou assim, se você quiser ser compatível com o modo tsx:

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

Lembre-se de que este é um elenco em tempo de compilação, e não um elenco de tempo de execução.

peixe branco
fonte
10
Agora, vejo isso no documento, referido como asserções de tipo na seção 4.13.
Klaus Nji #
Essa resposta não fornece mais a imagem completa da asserção de tipo em texto datilografado, enquanto a resposta de Alex fornece uma imagem mais completa e deve ser a resposta aceita.
Kristoffer Dorph
@KristofferDorph Esta resposta tem 4 anos. No momento da redação, o TypeScript estava na versão 0.8.1 e, portanto, era a resposta correta na época. O suporte a JSX foi incluído apenas três anos depois.
blorkfish
@blorkfish que é verdade, mas é uma boa prática para acompanhar os tempos, para que as pessoas fazendo a mesma pergunta hoje recebe a resposta atual, e não como ele, onde há 4 anos :-)
Kristoffer Dorph
160

Isso é chamado de asserção de tipo no TypeScript e, desde o TypeScript 1.6, existem duas maneiras de expressar isso:

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

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

Ambas as alternativas são funcionalmente idênticas . A razão para introduzir a assintaxe-é que a sintaxe original entra em conflito com o JSX . Consulte a discussão sobre design aqui .

Se você estiver em posição de escolher, use a sintaxe com a qual você se sentir mais confortável. Pessoalmente, prefiro a assintaxe-porque parece mais fluente ler e escrever.

Alex
fonte
2
Como você indica para texto datilografado que converteu um objeto em outro tipo? Por exemplo, uma função que retorna type2, dentro dela, http obtém o tipo 1, faz lógica para converter e retorna o que era type1, mas agora é type2?
Tony Gutierrez
@TonyGutierrez Como você faz a conversão?
Alex #
1
Basicamente, pegue uma propriedade e modifique. A única maneira que encontrei para fazer isso é criar um novo var (type2) e copiar os adereços do type1var e depois devolvê-lo. Você não pode modificar o type1 e retornar, ou recebe um erro "Não é possível transmitir".
Tony Gutierrez
1

No texto datilografado, é possível fazer uma instanceofverificação em uma instrução if e você terá acesso à mesma variável com as Typedpropriedades.

Então, digamos que MarkerSymbolInfotenha uma propriedade chamada marker. Você pode fazer o seguinte:

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

É um pequeno truque agradável para obter a instância de uma variável usando a mesma variável sem precisar redesigná-la para um nome de variável diferente.

Confira estes dois recursos para obter mais informações:

TypeScript instanceof & JavaScript instanceof

Newteq Developer
fonte