개발/typescript

타입스크립트 기초 문법 - 제네릭과 프로미스

모그 2024. 1. 3. 15:24

프로미스 기초

📌const promise = new Promise(실행함수)

📌비동기처리를 위한 내장 객체

📌매개변수로는 resolve / reject 두 가지를 받는다. 

      ✔️resolve - 비동기 작업의 상태를 성공으로 바꾸는 함수

      ✔️reject - 비동기 작업의 상태를 실패로 바꾸는 함수

📌then과 catch는 각각 비동기처리가 성공했을 때, 실패했을 때 실행되는 함수이다.

 


const promise = new Promise((resolve,reject)=>{
    setTimeout(()=>{
    	resolve(10) // 10은 비동기작업의 결과값
    },3000)
})

 

3초 후 resolve를 호출해 비동기 작업을 성공 상태로 바꾼 후 

작업의 결과값을 "인수"로 전달한다.

 

  • then은 resolve가 실행됐을 때, 즉 비동기 작업이 성공했을 때 실행된다.

promise.then((res)=>{
	console.log(res) // 10
})

 

  • catch는 반대로 reject가 실행됐을 때 실행된다. 

promise.catch((error)=>{
	console.log(error)
})

 

 

제네릭과 프로미스

여기서 주의할 점은

비동기작업의 결과값에 타입을 정의해주지 않았을 때,

 

✔️resolve의 결과값은 unknown 타입으로 추론된다.

물론 이후 따라오는 then 함수에 전달된 resolve의 결과값 역시 unknown 타입으로 정의된다.

unknown 타입은 추후 메서드 사용이 불가하기때문에 오류가 발생 할 가능성이 높아 타입 정의를 분명히 해두는게 좋다.

 

✔️reject는 any타입으로 추론된다.

때문에 catch 함수에서 타입좁히기를 사용해 코드를 짜볼 수 있다.

 

<예시>


const promise = new Promise<number>((resolve,reject)=> {
	setTimeout(()=>{
		reject(20) //20은 비동기작업의 결과값
	}, 3000)
});

promise.then((response)=>{
	console.log(response) // 20
})

promise.catch((error)=>{ //error -> any 타입
	if(typeof error === "string"){[
		console.log(error)
	]}
})

 

 

프로미스를 반환하는 함수의 타입


interface Post {
	id:number;
	title:string;
	content:string;
}

function fetchPost(){
	return new Promise((resolve,reject) => {
		setTimeout(()=>{
			resolve({
				id:1,
				title:"title",
				content:"contents"
			})
		},3000)
	})
}

const postrequest = fetchPost();

postrequest.then((post)=>{
	post.id // 이 경우 매개변수가 unknown 타입으로 추론되어 메서드를 쓸 수 없어 오류 발생 
})

 

비동기작업 결과값에 타입을 정의해주지 않았을 경우, resolve의 인수는 unkown으로 추론된다.

때문에 unknown 타입인 post에서 id 프로퍼티를 찾을 수 없어 오류메시지가 뜬다.

 

 

이 경우 반환값의 타입을 명확히 정의해야한다.


function fetchPost(){
	return new Promise<Post>((resolve,reject) => {
		setTimeout(()=>{
			resolve({
				.........
			})
		},3000)
	})
}

 

혹은

function fetchPost():Promise<Post>{
	return new Promise((resolve,reject) => {
		setTimeout(()=>{
			resolve({
				.........
			})
		},3000)
	})
}

 

이렇게 첫 줄에 타입을 선언할 수 있다.