DRY(Don’t repeat yourself) 원칙 : 같은 코드를 반복하지 말라.

Partial<T>

interface Options {
	width: number
	height: number
	color: string
	label: string
}

interface OptionsUpdate1 {
	width?: number
	height?: number
	color?: string
	label?: string
}

type OptionsUpdate2 = {[k in keyof Options]?: Options[k] }

type OptionsUpdate3 = Partial<Options>

typeof

typeof는 언제나 타입이 아닌 값에 할당되어야 한다. “타입의 타입”이라는 말이 어색하잖아

const INIT_OPTIONS = {
  width: 640,
  height: 480,
  color: '#00FF00',
  label: 'VGA',
}

interface Options1 {
  width: number;
  height: number;
  color: string;
  label: string;
}

type Options2 = typeof INIT_OPTIONS

제너릭 타입의 제한

DRY 원칙의 핵심이 제너릭이다.

제너릭 타입에서 매개변수를 제한할 수 있는 방법이 필요하다. <T extends Name>은 T라는 타입이 최소한 Name 타입이 가지고 있는 속성은 꼭 가지고 있어야 한다는 것을 알려준다.

interface Name {
  first: string
  last: string
}

type DancingDuo<T extends Name> = [T, T]

const couple: DancingDuo<Name> = [
  { first: 'Fred', last: 'Astaire' },
  { first: 'Ginger', last: 'Rogers' },
]

const couple2: DancingDuo<{ first: string }> = [
  { first: 'Sonny' },
  { first: 'Cher' },
] // 'Name'타입에 필요한 'last'속성이 타입에 없습니다.

Pick을 extends를 사용하여 안전하게 사용할 수 있다.

type Pick<T, K extends keyof T> = {
	[k in K]: T[k] // 정상
}