promise.allSettled를 typescript와 함께 사용하는 방법은 무엇입니까?

Nov 20 2020

Promise.allSetttled내가 ts config comilerOptions를 설정 했음에도 불구하고 Typescript 빌드가 좋지 않은 것 같아서 실패합니다."lib": [ "ES2020.Promise" ],

에 대한 응답처럼 보인다 promise.allSettled포함되지 않습니다 resultreason.

typescript 빌드를 실행할 때 다음 오류가 발생합니다.

Property 'reason' does not exist on type 'PromiseSettledResult<IMyPromiseResult>'.

Property 'value' does not exist on type 'PromiseRejectedResult'.

내 코드 블록은 다음과 같습니다 당신이 볼 수 있듯이, 나는 액세스하려 reason하고 result해결받을 약속의 eaech에서.

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

올바른 인터페이스를 포함하도록 Promise.allSettled 선언을 어떻게 업데이트 할 수 있습니까?

답변

2 Jens Nov 20 2020 at 11:46

Bergi가 언급했듯이 TypeScript는 유형을 확인할 때 유형이 PromiseFulfilledResult/ 인지 알지 못합니다 PromiseRejectedResult.

유일한 방법은 약속 결과를 던지는 것입니다. 이는 해결 된 약속이 이행되었는지 또는 거부되었는지 이미 확인했기 때문에 수행 할 수 있습니다.

이 예를 참조하십시오.

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);
}
2 bela53 Nov 20 2020 at 13:13

find유형 조건자를 반환하는 유형 가드로 콜백을 정의합니다 .

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

데모 플레이 그라운드