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
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