Typescript: Prečo môže byť PromiseLike možné typovanie pre this v objekte v asynchrónnej funkcii?
Napísal som túto funkciu, ale vyhodí chybu a ja nerozumiem, prečo...
const createObject = async (): Promise<MyType> => {
await Promise.resolve();
return {
async foo() {
await this.bar();
// do something else
},
async bar() {
await Promise.resolve();
// do something here
}
};
};
interface MyType {
foo: () => Promise<void>;
bar: () => Promise<void>;
}
Prečo volanie funkcie v riadku 5 this.bar() zobrazuje chybu? Hovorí mi, že this je buď typu MyType alebo PromiseLike<MyType>. Problém je v druhom možnom type, ale nevidím, v akom prípade by toto mohlo byť PromiseLike? Nemôže to predpokladať, že ak sa táto funkcia volá, this je vždy "nahratý" object?
Aký je najvšestrannejší spôsob, ako sa tomu vyhnúť? Momentálne to robím takto (čo je absolútne škaredé a ako čitateľ kódu to nie je pochopiteľné):
await (await this).bar();
Tiež som zistil, že nastavenie návratového typu funkcie createObject z Promise<MyType> na Promise<any> problém rieši, ale nie je to veľmi presné.
Odpoveď č. 1
Keďže createObject je async funkcia vracajúca Promise<MyType>, return príkaz v nej môže vrátiť buď Promise<MyType> alebo MyType. Obe sú platné. Takže keď priamo vrátite objektový literál, TypeScript nie celkom intuitívne odvodí, že typ objektu je Promise<MyType> | MyType a typ this nastaví podľa toho.
Neexistuje spôsob, ako to zmeniť, ak je objektový literál priamo v návrate. To, čo môžete urobiť, je použiť medzivariabilnú premennú. Táto premenná bude typovo nezávislá a potom bude skontrolovaná voči návratovému typu:
const createObject = async (): Promise<MyType> => {
await Promise.resolve();
let result: MyType = {
async foo() {
await this.bar();
// do something else
},
async bar() {
await Promise.resolve();
// do something here
}
};
return result;
};
interface MyType {
foo: () => Promise<void>;
bar: () => Promise<void>;
}
Odkaz na ihrisko
