2017-11-19 3 views
2

なぜ次の例はコンパイルされませんか?基本的には、非同期の反復可能なクロージャを正しく宣言する方法が問題です。Typescript:Async * iterator closureがコンパイルされない

class Test { 
    async foo() { 
    const c = async() => { 
    }; 
    await c(); 
    } 

    async * bar() { 
    const c = async *() => { 
    }; 
    yield * c(); 
    } 
} 

エラーは以下のとおりです。

...: error TS1109: Expression expected. 
...: error TS1005: ';' expected. 

マイtsconfig.json:私は次のように例を変更した場合

{ 
    "compilerOptions": { 
    "declaration": true, 
    "lib": [ 
     "es2017", 
     "dom", 
     "esnext.asynciterable" 
    ], 
    "module": "commonjs", 
    "target": "es2015", 
    "sourceMap": true, 
    "outDir": "out", 
    "experimentalDecorators": true, 
    "emitDecoratorMetadata": true, 
    }, 
    "include": [ 
     "src/**/*.ts" 
    ] 
} 

、それが動作します。矢印構文の代わりに関数を使用します。

class Test { 
    async foo() { 
    const c = async() => { 
    }; 
    await c(); 
    } 

    async * bar() { 
    const c = async function *() { 
    }; 
    yield * c(); 
    } 
} 
+2

どのようなエラーで失敗しますか? – Carcigenicate

+0

tsconfig.jsonの内容を表示してください。 –

答えて

2

Arrow function()=>{}と定期的な機能は、ここでプレーしているいくつかの違いがあります。例えば、矢印機能にはthisバインディングがありません。さらに、ジェネレータのドキュメントでは、反復のためにthisを使用するため、function構文を使用する必要があることが明確に記載されています。

2

arrow-function async-generatorsはまだサポートされていません。すなわちconst c = async *()=> {};。ジェネレータと同様

、非同期ジェネレータのみ機能 宣言、関数式、またはクラスまたはオブジェクト リテラルの方法であってもよいです。 矢印機能を非同期ジェネレータにすることはできません。

https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html

関連する問題