Typescript: Zašto je PromiseLike mogući tip ovog u objektu u asinhronoj funkciji?
Napisao sam ovu funkciju, ali baca pogrešku i ne razumijem zašto...
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>;
}
Zašto poziv funkcije u liniji 5 this.bar() prikazuje pogrešku? Kaže mi da je this tipa MyType ili PromiseLike<MyType>. Druga moguća vrsta je problem, ali ne vidim u kojem bi slučaju ovo moglo biti PromiseLike? Zar se ne može pretpostaviti da, ako se ta funkcija poziva, je this uvijek "učitani" objekt?
Koji je najzgodniji način za zaobići ovo? Trenutno radim ovako (što je apsolutno ružno i nerazumljivo kao čitatelju koda):
await (await this).bar();
Također sam otkrio da postavljanje tipa povratne vrijednosti funkcije createObject s Promise<MyType> na Promise<any> rješava problem, ali to nije vrlo točno.
Odgovor #1
Budući da je createObject asinkrona funkcija koja vraća Promise<MyType>, return iskaz unutar nje može vratiti ili Promise<MyType> ili MyType. Oba su valjana. Dakle, kada izravno vraćate objekt literal, TypeScript će donekle kontraproduktivno zaključiti da je tip objekta Promise<MyType> | MyType, i prema tome će tip this.
Ne postoji način da se to promijeni ako se objektni literal nalazi izravno u return izjavi. Ono što možete učiniti je koristiti posredničku varijablu. Ta će varijabla biti nezavisna od tipa, a zatim će se provjeriti u odnosu na tip povratne vrijednosti:
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>;
}
Veza za igralište
