[Typescript 8] generic 타입 제한

제네릭 타입제한

extend를 통해 확장하기

interface LengthType {
    length: number;
}
function logTextLength<T>(text: T): T {
    text.length; // 확장하기 전엔 T타입을 알수 없으므로(length사용가능한지 모르니까) 에러남
    return text;
}
// LengthType을 확장해주면 에러사라짐
function logTextLength<T extends LengthType>(text: T): T {
    text.length;
    return text;
}
logTextLength('hello'); // length가능한 문자열이어서 가능
logTextLength(10); // length불가해서 에러
logTextLength({length: 10}) // extend를 통해 타입이 부합하므로 가능

keyof를 통해 제한하기

interface ShoppingItem {
    name: string;
    price: number;
    stock: number;
}
function getShoppingItemOption<T extends keyof ShoppingItem>(itemOption: T): T {
    return itemOption;
}
// 아래처럼 인자로 10, 'a'를 넣으면 원래의 제네릭 정의에 따르면 가능하지만(호출시 타입 명시)
// ShoppingItem인터페이스를 확장하는 순간 name,price,stock 키만 인자로 가능
// getShoppingItemOption(10); 
// getShoppingItemOption<string>('a');
getShoppingItemOption('name'); // keyof를 이용하여 ShoppingItem의 키들만 넣을 수 있다 

@Sarah
개인적인 공부를 위해 만든 블로그입니다. 혹시 틀린 점이 있다면 메일로 남겨주시면 감사하겠습니다!

GitHubGmail