غیرهمزمان - تایپاسکریپت: بستهشدن تکرارگر Async * کامپایل نمیشود


چرا مثال زیر کامپایل نمیشود؟ در واقع، سوال این است که چگونه یک کلوزر تکرارشوندهی غیرهمزمان را به درستی اعلان کنیم.

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();
  } 
}

پاسخ شماره ۱

تابع فلش ()=>{} و تابع معمولی چند تفاوت دارند که در اینجا اعمال میشوند.

به عنوان مثال، تابع پیکانی هیچ ارتباطی با this ندارد.

علاوه بر این، مستندات مربوط به ژنراتورها به وضوح بیان میکند که شما باید از نحو function استفاده کنید زیرا از this برای تکرار استفاده میکند.

به همین دلیل است که تولیدکنندههای ناهمزمان از تابع پیکان پشتیبانی نمیکنند

پاسخ شماره ۲

هنوز پشتیبانیای برای استفاده از تابع فلشی با async-generators وجود ندارد؛ به عنوان مثال const c=async *()=> {};.

همانند ژنراتورها، ژنراتورهای ناهمزمان فقط میتوانند اعلان تابع، عبارت تابع، یا متدهای کلاسها یا آبجکتهای لیترال باشند. توابع فلش نمیتوانند ژنراتور ناهمزمان باشند.

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