하위 태스크 1 ~ 3
any vs unknown vs 제네릭
세 가지 방식의 차이와 문제점 확인
제네릭 함수 작성
타입 변수를 사용하는 함수 작성
타입 추론 확인
제네릭 함수 호출 시 타입 자동 추론
any타입: 해당 변수에 대한 타입 검사를 중단한다. 타입 신뢰도를 떨어뜨린다.unknown타입: 해당 변수에 대해 타입을 좁힌 후 사용해야 한다.any타입보다 타입 신뢰도가 높지만, 타입 좁히기를 위한 코드가 필요하다.- 제네릭 타입: 타입 매개변수를 사용해서 타입을 유연히 사용할 수 있다. 타입 신뢰도가 높고, 타입 유추가 뛰어나다.
src/generic-funcitons.ts:
// any 타입 사용
function funcAny(value: any) {
return value;
}
funcAny(1).map((v) => v.toString()); // 런타임 타임 오류 발생
// unknown 타입 사용
function funcUnknown(value: unknown) {
return value;
}
funcUnknown(1).toString(); // 컴파일 타입 오류 발생
function funcGeneric<T>(value: T) {
return value;
}
funcGeneric(1).toString(); // functionGeneric(1)의 반환 값은 1로 유추됨하위 태스크 4
제네릭 인터페이스
KeyPair 같은 제네릭 인터페이스 정의
src/generic-interface.ts:
interface KeyPair<K, V> {
key: K;
value: V;
}
const pair: KeyPair<string, number> = {
key: "cake",
value: 18000,
};하위 태스크 5
제네릭 타입 별칭
Map2 같은 제네릭 타입 별칭 정의
src/generic-interface.ts:
type Map2<T> = {
[key: string]: T
};
const mapToNumber: Map2<number> = {
cake: 18000,
};하위 태스크 6
Promise 제네릭
Promise, Promise 사용
src/promises.ts:
const maybeReturnNumber = new Promise<number>((resolve) => {
resolve(100);
});
maybeReturnNumber
.then((response) => { // response의 타입은 number
console.log(`response는 숫자다: ${typeof response === "number"}`);
});
interface Post {
title: string;
description: string;
}
const post: Post = {
title: "푸른 하늘 은하수",
description: "화성 가자",
};
const maybeReturnPost = new Promise<Post>((resolve) => { // maybeReturnPost의 타입은 Promise<Post>
resolve(post);
});하위 태스크 7
async 함수 타입
async 함수의 반환 타입 확인
src/promises.ts:
async function loadPost(): Promise<Post> {
return Promise.resolve(post);
}
const postPromise = loadPost(); // postPromise의 타입은 Promise<Post>하위 태스크 8
제네릭 클래스
Stack 같은 제네릭 클래스 작성
src/generic-classes.ts:
class Stack<T> {
private items: T[] = [];
push(item: T) {
this.items.push(item);
}
pop() {
return this.items.pop();
}
}
const stackOfNumbers = new Stack<number>();
const stackOfStrings = new Stack<string>();하위 태스크 9
타입 변수 제약
extends로 타입 변수 제약 추가
src/generic-classes.ts:
// ...
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {
return obj[key];
}
console.log(getProperty({ name: "홍길동", age: 23 }, "name")); // 홍길동