-> 데이터 타입을 일반화함(generalize), 자료형을 정하지 않고 여러 타입을 사용할 수 있음
-> 선언 시점이 아닌, 생성 시점에 타입을 명시해, 다양한 타입을 사용할 수 있음
-> 타입을 함수의 파라미터처럼 사용
-> 함수 사용 시 타입 추론이 됨
제네릭 정의
function logText<T>(text: T):T {
console.log(text);
return text;
}
logText("hi"); //function logText<"hi">(text: "hi"):"hi"
logText<string>("hi"); //function logText<string>(text: string):string
//제네릭을 이용해 타입 추론이 됨: type이 다르다는 이유 하나만으로 같은 내용의 함수를 중복 선언해야함
예시) 같은 내용의 함수를 string, number 타입으로
function logText(text: string) {
console.log(text);
return text;
}
function logNumber(num: number) {
console.log(num);
return num;
} : 타입들의 공통되는 api만 접근 가능함
: 반환값의 타입 또한 여전히 유니온 타입
function logText(text: string|number) {
console.log(text);
//text. -> string과 number의 공통 api만 접근 가능
return text;
}
const word = logText('a'); //word의 type은 여전히 string|numberfunction logText<T>(text: T): T {
console.log(text);
return text;
}
const str = logText<string>('abc');
str.split(''); //string api 사용 가능
const login = logText<boolean>(true); //boolean 변경 가능
interface Dropdown<T>{
value: T; // 넘기는 값이 어떤가에 따라 value의 타입이 바뀜
selected: boolean;
}
const obj: Dropdown<number> = {value: 10, selected: true}; //value: number
const obj_: Dropdown<string> = {value:"hello",selected: false}; //value: string: 제네릭 함수에 어느 정도 타입 힌트를 줄 수 있음
function logText<T>(text: T): T {
console.log(text.length); // Error: T doesn't have .length
return text;
}-> 위 코드에서 text에 length가 존재한다는 단서가 없기 때문에 에러가 발생함
function logText<T>(text: T[]): T[] {
console.log(text.length); // 제네릭 타입이 배열이기 때문에 `length`를 허용합니다.
return text;
}-> T[]를 사용해 배열형태의 T를 받는다는 힌트를 남김
: extends 키워드 이용
interface LengthType {
length: number;
}
function logTextLength_<T extends LengthType>(text: T): T{
text.length;
return text;
}
logTextLength_("hello");: 지정한 key 값들만 받을 수 있도록 제약함
interface ShoppingItem {
name: string;
price: number;
stock: number;
}
//interface ShoppingItem 안의 key값들만 받을 수 있도록 제약 가능
function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T):T {
return itemOption;
}
// getShoppingItemOption(10);
// getShoppingItemOption<string>('a');
getShoppingItemOption("name");