Jak korzystać z promise.allSettled with maszynopis?
Promise.allSetttled
Kompilacja maszynopisu kończy się niepowodzeniem, ponieważ nie wygląda na to, mimo że ustawiłem kompilator konfiguracji ts z opcjami"lib": [ "ES2020.Promise" ],
Wygląda na to, że odpowiedź na promise.allSettled
nie zawiera result
lub reason
.
Podczas budowania skryptu pojawia się następujący błąd:
Property 'reason' does not exist on type 'PromiseSettledResult<IMyPromiseResult>'.
i
Property 'value' does not exist on type 'PromiseRejectedResult'.
Mój blok kodu wygląda tak i jak widać, próbuję uzyskać dostęp reason
i result
od eaech do obietnic, które zostaną rozwiązane.
const myPromise = async () : Promise<IMyPromiseResult> {
return new Promise((resolve) => {
resolve("hello world")
})
}
const data = await Promise.allSettled([
myPromise()
]);
const response = data.find(res => res.status === 'fulfilled')?.result;
if(!response) {
const error = data.find(res => res.status === 'rejected')?.reason;
throw new Error(error);
}
Jak mogę zaktualizować deklarację Promise.allSettled, aby zawierała prawidłowe interfejsy?
Odpowiedzi
Jak wspomniał Bergi, TypeScript nie wie, czy typ jest PromiseFulfilledResult
/ PromiseRejectedResult
podczas sprawdzania typów.
Jedynym sposobem jest oddanie obiecującego wyniku. Można to zrobić, ponieważ już zweryfikowałeś, że rozwiązana obietnica jest spełniona lub odrzucona.
Zobacz ten przykład:
const myPromise = async (): Promise<string> => {
return new Promise((resolve) => {
resolve("hello world");
});
};
const data = await Promise.allSettled([myPromise()]);
const response = (data.find(
(res) => res.status === "fulfilled"
) as PromiseFulfilledResult<string> | undefined)?.value;
if (!response) {
const error = (data.find(
(res) => res.status === "rejected"
) as PromiseRejectedResult | undefined)?.reason;
throw new Error(error);
}
Zdefiniuj find
callback jako typ strażnika, który zwraca predykat typu:
type IMyPromiseResult = string
const response = data.find(
(res): res is PromiseFulfilledResult<string> => res.status === 'fulfilled'
)?.value;
if (!response) {
const error = data.find(
(res): res is PromiseRejectedResult => res.status === 'rejected'
)?.reason;
throw new Error(error);
}
Demo Playground