타입스크립트의 제네릭을 활용하여 비동기 처리를 돕는 프로미스 객체의 타입을 정의해보자.
(Promise)
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(20); // 비동기 작업 성공시, 결과값
}, 3000);
});
promise.then((response) => {
console.log(response); // 20
});
unknown
타입)number
타입이라 이것이 자동으로 추론되길 기대하지만 실제 이 기능은 없음const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(20);
}, 3000);
});
promise.then((response) => {
console.log(response * 10); // ❌오류
});
const promise = new Promise<number>((resolve, reject) => { // 👈타입변수 할당
setTimeout(() => {
resolve(20);
}, 3000);
});
promise.then((response) => {
console.log(response * 10); // 200
});
const promise = new Promise<number>((resolve, reject) => {
setTimeout(() => {
// resolve(20);
reject("~때문에 실패");
}, 3000);
});
promise.then((response) => {
console.log(response * 10);
});
promise.catch((err) => {
if (typeof err === "string") {
console.log(err);
}
});
interface Post {
id: number;
title: string;
content: string;
}
function fetchPost() {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
id: 1,
title: "게시글 제목",
content: "게시글 컨텐츠",
});
}, 3000);
});
}
const postResquest = fetchPost();
postResquest.then((post) => {
post.id; // ❌오류
});
post
는 unknown
타입이므로 오류가 발생한다.Post
타입 변수 할당interface Post {
id: number;
title: string;
content: string;
}
function fetchPost() {
return new Promise<Post>((resolve, reject) => { // 👈
setTimeout(() => {
resolve({
id: 1,
title: "게시글 제목",
content: "게시글 컨텐츠",
});
}, 3000);
});
}
const postResquest = fetchPost();
postResquest.then((post) => {
post.id; // 오류 사라짐
});
Promise는 class이기 때문에 타입으로도 활용되고 있음
fetchPost
함수의 반환값 타입으로 Promise<Post>
설정interface Post {
id: number;
title: string;
content: string;
}
function fetchPost(): Promise<Post> { // 👈
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve({
id: 1,
title: "게시글 제목",
content: "게시글 컨텐츠",
});
}, 3000);
});
}
const postResquest = fetchPost();
postResquest.then((post) => {
post.id; // 오류 사라짐
});
※
해결방법2
를 선호하는 이유 ※
- 협업의 관점에서 함수의 선언부분만 보고도 "
fetchPost
함수는Promise
를 반환하는구나!" 라고 바로 확인가능 → 가독성↑- 함수 내부가 길어지면 리턴문 타입을 찾기위해 계속 찾아봐야 함