차별된 유니온 타입 TypeScript는 JavaScript가 어떻게 동작하는지 잘 이해하며, 마치 프로그래머가 머리로 프로그램을 추적하듯이 코드로부터 타입을 정제해 낼 수 있습니다. 예를 들어 응용 프로그램의 커스텀 이벤트 시스템을 만든다고 가정합니다. 먼저 몇 가지 이벤트 타입과 이벤트들을 처리할 함수를 정의합니다. KeyBoardEvent는 키보드 이벤트를, MouseControlEvent는 마우스 이벤트를 가리킵니다. type KeyBoardEvent = {value: string} type MouseControlEvent = {value: [number, number]} type FirstEvent = KeyBoardEvent | MouseControlEvent function handle(ev..
정제 TypeScript는 심벌 수행(symbolic execution)의 일종인 흐름 기반 타입 추론을 수행합니다. 즉, 타입 검사기는 typeof, instanceof, in 등의 타입 질의뿐 아니라, 마치 프로그래머가 코드를 읽듯 if, ?, ||, switch 같은 제어 흐름 문장까지 고려하여 타입을 정제(refinement)합니다. 이는 타입 검사기에 제공되는 아주 유용한 기능으로 오직 일부의 언어에서만 지원합니다. 예를 살펴보겠습니다. TypeScript에 CSS 규칙을 정의하는 내장 API가 있고 동료 개발자가 HTML 요소의 너비(width)를 설정하려 한다고 가정해 봅시다. 너비를 전달하면 이를 파싱하고 검증할 것입니다. 먼저 CSS 문자열을 값(value)과 단위(unit)로 파싱 하는..
초과 프로퍼티 TypeScript가 한 객체 타입을 다른 객체 타입에 할당할 수 있는지 확인할 때도 타입 넓히기를 이용합니다. 객체 타입과 그 멤버들은 공변 관계라는 규칙만을 적용하면 문제가 발생할 수 있습니다. 예를 들어 다음처럼 클래스에 전달해 그 내부 상태를 설정하는 용도의 Options라는 객체가 있다고 해보겠습니다. type Options = { baseURL: string cacheSize?: number tier?: 'prod' | 'dev' } class API { constructor(private options: Options){} } new API({ baseURL: 'https://cozy-linda.tistory.com', tier: 'prod' }) 옵션의 철자가 틀리면 어떤 일..
타입 넓히기(type widening) 타입 넓히기는 TypeScript의 타입 추론이 어떻게 동작하는지 이해하는 데 필요한 핵심 개념입니다. TypeScript는 타입을 정밀하게 추론하기보다는 일반적으로 추론합니다. (덕분에 프로그래머의 삶이 편해집니다) let이나 var로 값을 바꿀 수 있는 변수를 선언하면 그 변수의 타입이 리터럴 값에서 리터럴 값이 속한 기본 타입으로 넓혀집니다. let a = 'x' // let a: string let b = 2 // let b: number var c = true // boolean const d = { x: 4} // (property) x: number enum E {A, B, C} let e = E.A // let e: E 값을 바꿀 수 없는 변수에선 상..