Promise<T>는 제네릭 클래스로, resolve의 결과값 타입을 T로 설정할 수 있다.reject의 값은 타입을 지정할 수 없으며, 기본적으로 unknown이다.then() 메서드는 resolve 값을, catch() 메서드는 reject 값을 다룬다.Promise<타입>을 명시하여 비동기 작업의 결과 타입을 선언할 수 있다.Promise는 제네릭 클래스로 구현되어 있다. 따라서 새로운 Promise를 생성할 때 다음과 같이 타입 변수에 할당할 타입을 직접 설정해 주면 해당 타입이 바로 resolve 결과값의 타입이 됨.
const promise = new Promise<number>((resolve, reject) => {
setTimeout(() => {
// 결과값 : 20
resolve(20);
}, 3000);
});
promise.then((response) => {
// response는 number 타입
console.log(response);
});
promise.catch((error) => {
if (typeof error === "string") {
console.log(error);
}
});
❗
reject함수에 전달된 값의 타입은 지정할 수 없고, 타입스크립트에서는 기본적으로unknown으로 처리되므로,catch에서 타입 좁히기를 통해 안전하게 다뤄야 함.
어떤 함수가 Promise 객체를 반환한다면 함수의 반환 타입으로 Promise<타입>을 지정해야 함.
function fetchPost() {
return new Promise<Post>((resolve, reject) => {
setTimeout(() => {
resolve({
id: 1,
title: "게시글 제목",
content: "게시글 본문",
});
}, 3000);
});
}
또는 더 명확하게 반환 타입을 다음과 같이 직접 명시해도 됨.
function fetchPost(): Promise<Post> {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
id: 1,
title: "게시글 제목",
content: "게시글 본문",
});
}, 3000);
});
}
Promise<T>는 비동기 작업의 성공 결과를 T로 선언할 수 있도록 해주는 제네릭 클래스이다.reject() 결과값은 unknown으로 취급되므로 타입 확인이 필요하다.Promise<타입>을 사용하면 타입 안정성이 높아진다.