TypeScriptまたはJavaScriptの型キャスト


185

TypeScriptまたはJavaScriptで型キャストをどのように処理しますか?

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

    }
}

どこSymbolInfo基底クラスです。TypeScriptまたはJavascriptでからSymbolInfotoへの型キャストをどのように処理しMarkerSymbolInfoますか?

回答:


284

次のようにキャストできます。

return this.createMarkerStyle(<MarkerSymbolInfo> symbolInfo);

または、tsxモードと互換性を持たせる場合は、次のようにします。

return this.createMarkerStyle(symbolInfo as MarkerSymbolInfo);

これはコンパイル時のキャストであり、実行時のキャストではないことに注意してください。


10
今、私はそれをドキュメントで見ると、セクション4.13で型アサーションと呼ばれています。
Klaus Nji

この答えはtypescriptの型アサーションの全体像を提供しなくなりましたが、Alexの答えはより完全な全体像を示しており、受け入れられるはずです。
クリストファードルフ2017年

@KristofferDorphこの回答は4歳です。TypeScriptの記述時点ではバージョン0.8.1であり、当時は正解でした。JSXのサポートが含まれたのは3年後のことです。
blorkfish

@blorkfishは本当ですが、時間をたどるのは良い習慣です。そのため、今日同じ質問をする人々が現在の答えを得ます。4年前の場所ではそうではありません:-)
Kristoffer Dorph

160

これはTypeScriptでは型アサーションと呼ばれ、TypeScript 1.6以降、これを表現する方法は2つあります。

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

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

どちらの方法も機能的には同じですas-syntax を導入する理由は、元の構文がJSXと競合していたためですここでの設計の説明を参照してください

選択する立場にある場合は、使いやすい構文を使用してください。個人的asには、読み書きが流暢に感じられる-構文を好みます。


2
オブジェクトを別の型に変換したことをtypescriptにどのように示しますか?たとえば、type2を返すfuncの内部では、httpはタイプ1を取得し、変換するロジックを実行して、type1であったものがtype2になったものを返しますか?
トニーグティエレス2018

@TonyGutierrezどのように変換しますか?
Alex

1
基本的に、1つのプロパティを取得して変更します。これを行う唯一の方法は、新しいvar(type2)を作成し、type1varからプロップをコピーして返すことです。type1を変更して戻ることができないか、「Ca n't cast」エラーが発生します。
トニーグティエレス2018

1

typescriptではinstanceof、ifステートメントでチェックを行うことができ、Typedプロパティを使用して同じ変数にアクセスできます。

したがってMarkerSymbolInfo、その上にと呼ばれるプロパティがあるとしmarkerます。次のことができます。

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

変数を別の変数名に再度割り当てる必要なく、同じ変数を使用して変数のインスタンスを取得するのは、ちょっとしたトリックです。

詳細については、次の2つのリソースをご覧ください。

TypeScript instanceofおよび JavaScript instanceof

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.