Vyhledávání na webu

generator - Jak mohu zajistit, aby TypeScript automaticky odvodil typ výsledku volání `yield`?


V následujícím ukázkovém kódu:

function* gen() {
    let v = yield Promise.resolve(0);
    return v;
}

Typ v je odvozen jako any. Zajímá mě, zda existuje způsob, jak nechat odvodit jiný typ (například number) na základě kontextových nápověd.

Vím, že v tomto konkrétním scénáři mohu místo toho použít async/await, ale zajímá mě obecný případ (když nepracujeme s přísliby).

Odpověď č. 1

Bohužel, Typescript toto momentálně nepodporuje. A zdá se, že neexistuje dobré řešení jinak než jednoduše přidat typovou anotaci u každého výrazu yield:

function* gen() {
    let v: number = yield Promise.resolve(0);
    return v;
}

Je to složitý problém k vyřešení, protože hodnota vrácená příkazy yield závisí zcela na semantice toho, co generátor spotřebovává. Vím, že yield Promise.resolve(0) nakonec vrátí číslo jen proto, že znám semantiku coroutine, ale v skutečně může být cokoliv.

Ale doufejme, že Typescript přidá podporu pro deklarování těchto vztahů jako součást typu samotného generátoru. Tady je relevantní problém na GitHubu.

Související články