인터페이스나 클래스, 함수, 타입 alias 등에 사용할 수 있는 기능으로, 해당 심벌의 타입을 미리 지정하지 않고 다양한 타입에 대응하려고 할 때 사용합니다.

interface IValueable<T> {
	value: T
}

제네릭 타입 제약

제네릭 함수의 타입을 제한 할 수 있습니다.

인덱스 타입 제약

만약 pick 함수를 사용할 때 프로퍼티 명을 오타를 낼 수 있습니다.

import pick from './pick';

const obj = { 
	name: 'Jane',
	age: 22,
	city: 'Seoul',
	country: 'Korea',
};

console.log(
	pick(obj, ['name', 'age'],
	pick(obj, ['name', 'agge'],
);

타입스크립트는 이런 경우 keyof T 형태로 타입 제약을 설정할 수 있게 지원합니다. 이것을 '인덱스 타입 제약(index type constraint)' 이라고 합니다.

const pick = <T, K extends keyof T>(obj: T, keys: K[]) => keys
    .map(k => ({ [k]: obj[k] }))
    .reduce((result, value) => ({ ...result, ...value }), {});

const obj = {
	name: 'Jane',
	age: 22,
	city: 'Seoul',
	country: 'Korea',
};

console.log(
	pick(obj, ['name', 'age']),
	pick(obj, ['name', 'agge']), // error!
);

이제 컴파일 전에 오류를 확인할 수 있습니다!

대수 데이터 타입

객체지향 프로그래밍 언어에서 ADT라는 용어는 추상 데이터 타입(abstract data type) 을 의미하지만, 함수형 언어에서는 대수 데이터 타입(algebraic data type)을 의미합니다.

타입스크립트에서 대수 데이터 타입은 합집합 타입(union type)과 교집합 타입(intersection type) 두가지 종류가 있습니다.