DRY(Don’t repeat yourself) 원칙 : 같은 코드를 반복하지 말라.
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는 언제나 타입이 아닌 값에 할당되어야 한다. “타입의 타입”이라는 말이 어색하잖아
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'속성이 타입에 없습니다.
type Pick<T, K extends keyof T> = {
[k in K]: T[k] // 정상
}