2017-03-06 16 views
2

async関数を使用して、型付きエラーで約束を拒否する既存の約束ベースのAPIを呼び出しています。あなたはこのように、この動作を模擬できどのように非同期catch()で型付きエラーを使用しますか

:私はエラーに注釈を付けるしようとした場合

api().catch((error: ApiError) => console.log(error.code, error.message)) 

しかしasyncを使用して:約束と今

interface ApiError { 
    code: number; 
    error: string; 
} 

function api(): Promise<any> { 
    return new Promise((resolve, reject) => { 
    reject({ code: 123, error: "Error!" }); 
    }); 
} 

、私はApiErrorにエラーの種類に注釈を付けることができますタイプ:try ... catch()

async function test() { 
    try { 
    return await api(); 
    } catch (error: ApiError) { 
    console.log("error", error); 
    } 
} 

これはエラーでコンパイル:

Catch clause variable cannot have a type annotation.

どのように、そして、私は私が期待していエラーの種類を知っていますか? catch()ブロックにアサーションを書く必要がありますか?これは非同期のバグ/不完全な機能ですか?

答えて

3

TypeScriptでは、catch句の変数に型名が付いていない可能性があります。これはasyncに固有のものではありません。ここan explanation from Anders Hejlsbergです:

We don't allow type annotations on catch clauses because there's really no way to know what type an exception will have. You can throw objects of any type and system generated exceptions (such as out of memory exception) can technically happen at any time.

あなたはキャッチボディに(必要に応じてuser-defined type guardを使用して)error.codeerror.messageプロパティが存在するかどうかを確認することができます。

+0

ありがとうございました。私は 'Promise.catch()'に型引数がないのと同じ理由だと思います。それでも、私は、私が期待しているエラーを書き留めておきたいと思います。TSの多くはあなたが期待しているものを書いているだけです。確かに、あなたのタイプのどれもが実行時に真実になるという保証はありません! – Aaron

+0

@Aaron catchブロック内で 'const apiError:ApiError = error;'を実行することができます(エラーは 'any'型です) –

+1

これは私がやっていることです。その約束は少し簡潔です。 – Aaron

0

このエラーは、asyncとは関係ありません。キャッチ変数をタイプすることはできません。

理由は簡単です。コードがコンパイルされるまで、TypeScriptの型は存在します。いったんコンパイルされると、型なしのJavaScriptだけが得られます。

キャッチ句にタイプフィルタを設定すると、実行時にエラーのタイプを確認する必要があり、信頼性の高い方法がないため、このような機能はサポートされない可能性があります。

関連する問題