2017-06-07 33 views
3

これまでのところ型付きが好きですが、型アサーションをたくさん行う必要があることがわかりました。たとえば、EventTargetをHTMLAnchorElementにキャストすることは、私の一般的な使用例です。しかし、私は次のようなものを使用する必要があることを取得する:パラメータ内の型宣言型アサーション

getTabID(eventTarget: EventTarget) : string { 
    // without the following variable, the compiler tells me that .hash 
    // is not a property of EventTarget, which according to the interface, it isn't. 
    // So thats fine, i'll cast it to an Element 
    let mEventTarget: HTMLAnchorElement = <HTMLAnchorElement>eventTarget 
    let mTabID: string 
    if(mEventTarget.hash){ 
     mTabID = mEventTarget.hash.split('#')[1] 
    } 
    return mTabID 
} 

しかし、これは私がJUSTタイプのアサーションを行うには、私の関数で変数を作成する必要がエラーをスローするようにコンパイラにしたくない場合はことを意味します。余計な入力は気にしませんが、これらもJSで終わり、jsファイルにバイトを無駄にしてしまいます。

私は次のことができるようにしたいと思います:

getTabID(eventTarget: EventTarget) : string { 
    let mTabID: string 
    // Do the type assertion in the parameter 
    if(<HTMLAnchorElement> eventTarget.hash){ 
     mTabID = mEventTarget.hash.split('#')[1] 
    } else { 
     mTabID = mEventTarget.dataset.tabId 
    } 
    return mTabID 
} 

私は、ドキュメント内の良好な外観を持っていたし、SOおよびこれを行うにはどのような方法を見つけるように見えることはできません。誰でもアイデアはありますか?

+2

'eventTarget'が常に' HTMLAnchorElement'になることを確信しているならば、 'eventTarget:HTMLAnchorElement'をパラメータに宣言し、' getTabID'の呼び出し側が 'HTMLAnchorElement'であることを強制するのはなぜですか? – Saravana

+1

あなたは 'eventTarget:EventTarget | HTMLAnchorElement'型であり、EventTargetとHTMLAnchorElementの両方を型として使用可能にします。 – Wernerson

+0

@Saravanaその関数を呼び出すと、 'HTMLAnchorElement'を期待する関数に' EventTarget'を渡すことができないというエラーが発生します。 @Wernerson私はそれがエラーを止めると思うが、ハックのようだ。 – C02Equinox

答えて

0

あなたは括弧でアサーションを囲むことにより、インラインタイプのアサーションを行うことができます。

if((<HTMLAnchorElement>eventTarget).hash) { 

また、あなたは、たとえば、型アサーションの必要性を防ぐために何ができるか表示される場合があります。

​​

最後に、例の1つにEventTargeteventTargetを混ぜて、ケーシングに注意してください。

+0

あなたの最初の解決策は、私が望んでいたことであり、すばらしく動作するようです。ありがとう! しかし、2番目の解決方法では、問題をその関数から呼び出し元に移すだけです。 'this.getTabID(event.target) ' は、HTMLAnchorElement型にEventTargetを割り当てることができないというエラーを単にスローします – C02Equinox

0

タイプガードを使用してこれを実装できます。

例は次のようになります。

function isAnchor(eventTarget: EventTarget): eventTarget is HTMLAnchorElement { 
    return (<HTMLAnchorElement>eventTarget).hash != undefined; 
} 


function getTabID(eventTarget: EventTarget): string { 
    let mTabID: string 
    // Do the type assertion in the parameter 
    if (isAnchor(eventTarget)) { 
    mTabID = eventTarget.hash.split('#')[1] 
    } else { 
    mTabID = eventTarget.dataset.tabId 
    } 
    return mTabID 
} 

注:私はデータセットはの一部だったが、あなたは同様にそれのための型ガードを作ることができますどのようなインタフェースを知りませんでした。

タイプガードの詳細については、ハンドブックhereを参照してください。

+0

提案に感謝します!これはコンパイラを満足させますが、型アサーションを行うだけの全く新しい関数を実装しています。これにより、コードエラーの可能性は低くなりますが、ファイルサイズを小さくすることはできません。 – C02Equinox