Archive

Typescript Day 09 - 제네릭

|

Typescript Day 09 - 제네릭


제네릭 타입

제네릭 타입은 인터페이스나 클래스, 함수, 타입 별칭 등에 사용할 수 있는 기능으로, 타입을 미리 지정하지 않고 다양한 타입에 대응하려 할 때 사용한다.

제네릭은 타입변수라고도 부른다. 타입 자체를 파라미터처럼 받아서 사용이 가능하다.

제네릭은 일반적으로 대문자로 적는것이 관례이다.

// 제네릭 인터페이스
interface IValue<T> {
    value: T
}

// 제네릭 함수
function sum<T>(arg: T): T {
    return arg
}

// 제네릭 타입 별칭
type IValue<T> = {
    value: T
}

// 제네릭 클래스
class Value<T> {
    constructor(public value: T){}
}


// 제네릭 사용 예시
function identity<T>(arg: T): T {
    return arg;
}

let output = identity<string>('hello world'); // hello world
let output = identity('hello world'); // 타입 추론도 가능하다


제네릭 타입 제약

제네릭 타입 제약은 타입 변수에 적용할 수 있는 타입의 범위를 한정하는 기능을 한다.

<최종타입 extends 타입1>(a: 최종타입){}

interface IValuable {
    length: number
}

const printValue = <T extends IValueable>(arg: T) => console.log(arg.length);

printValue(3); // Error: number는 length 프로퍼티가 없다
printValue({length: 10}); // 10


인덱스 타입 제약

타입 매개변수로 다른 타입 매개변수를 제한할 수 있다.

function getProperty<T, K extends keyof T>(obj: T, key: K) {
    return obj[key];
}

let x = { a: 1, b: 2, c: 3 };

getProperty(x, "a"); // 1
getProperty(x, "z"); // Error: 'z'가 해당되는 인수가 없다 



참고 자료


Do it 타입스크립트 프로그래밍

Typescript-Handbook