[TS] Promise Generic type

장동균·2022년 2월 16일
1

문제 상황

const promise = new Promise((resolve, reject) => resolve(45))

promise.then(result => result * 4)  // Error

에러가 발생한 이유는 result의 type이 {}로 추론되었기 때문이다. {}number는 곱할 수 없기 때문에 에러가 발생한 것이다.

그렇다면 왜 타입스크립트는 result를 {}로 추론했을까?

이는 우리가 타입스크립트에 충분한 정보를 제공하지 않았기 때문이다. 타입스크립트는 제네릭 함수의 인수에만 의지하여 제네릭 타입을 추론하는데 인수가 아무 것도 없기 때문에 기본적으로 T(제네릭 함수의 변수)를 {}로 간주한 것이다.

const promise = new Promise<number>((resolve, reject) => resolve(45))

promise.then(result => result * 4)  // 180

그렇다면 resolve로 전달하는 값과 reject로 전달하는 값의 type이 다른 경우는 어떻게 해야 할까?

Promise generic type에서는 non-error-return-type, 즉 resolve 함수를 통해 전달되는 값에 대한 type만을 지정하면 된다. reject 함수를 통해 전달되는 값은 이미 any로 타입이 지정되어 있다.

function test(arg: string): Promise<number> {
    return new Promise<number>((resolve, reject) => {
        if (arg === "a") {
            resolve(1);
        } else {
            reject("1");
        }
    });
}

참고문헌

타입스크립트 프로그래밍(프로그래밍 인사이트, 보리스 체르니 지음)
https://stackoverflow.com/questions/41078809/typescript-promise-generic-type

profile
프론트 개발자가 되고 싶어요

0개의 댓글