한정된 다형성 이번엔 이진트리 예제를 사용합니다. 기본적으로 이진트리의 특징은 아래와 같습니다. 이진트리는 자료구조입니다. 이진트리는 노드를 갖습니다. 노드의 값을 가지며 최대 두 개의 자식 노드를 가리킬 수 있습니다. 노드는 잎 노드(leaf node: 자식이 없음) 또는 내부 노드(inner node: 적어도 한 개의 자식을 가짐) 둘 중 하나의 타입을 갖습니다. "T는 제네릭 타입이며, 이것은 T와 같은 타입이어야 한다"는 말로 표현할 수 없는 상황이 많습니다. 때론 U 타입은 적어도 T 타입을 포함하는 기능이 필요합니다. 이러한 상황을 U가 T의 상한 한계(upper bound)라고 설명합니다. 아래와 같은 세 종류의 노드를 갖는 이진트리를 구현한다고 해보겠습니다. 일반 TreeNode 자식을 갖..
다형성 모든 타입은 구체 타입(concrete type)입니다. boolean string Date[] {a: number} | {b: string} (numbers: number[]) => number 기대하는 타입을 정확하게 알고 있고, 실제 이 타입이 전달되었는지 확인할 때는 구체 타입이 유용합니다. 하지만 때론 어떤 타입을 사용할지 미리 알 수 없는 상황이 있는데, 이런 상황에선 함수를 특정 타입으로 제한하기 어렵습니다. JavaScript로 filter를 이용하여 배열을 반복하면서 정제하는 코드를 아래처럼 구현할 수 있습니다. function filter(array, f){ let result = [] for(let i = 0; i < array.length; i++) { let item = a..
문맥적 타입화(contextual typing) // log(message: string, userName?: string) 함수 type Log = (message: string, userName?: string) => void let log: Log = ( // ① message, // ② userName = '로그인 안했는데염...' // ③ ) => { // ④ let time = new Date().toISOString() console.log(time, message, userName) } 위의 코드는 함수의 매개변수 타입을 명시하지 않아도 되는 사례입니다. 이미 log의 타입을 Log로 지정했으므로 TypeScript가 message의 타입을 string으로 추론할 수 있기 때문입니다. 이는..
호출 시그니처 아래 코드의 sum은 함수이므로 sum은 Function 타입이라고 말할 수 있습니다. function sum(a: number, b: number): number{ return a + b } Function은 사람들이 즐겨 사용하는 타입은 아닙니다. object로 모든 객체를 가리킬 수 있는 것처럼 Function은 모든 함수의 타입을 뜻할 뿐이며 이것이 가리키는 특정 함수와 타입과 관련된 정보는 아무것도 알려주지 않습니다. sum은 number를 인수로 받아 한 개의 number를 반환하는 함수입니다. TypeScript에선 다음과 같이 표현할 수 있습니다. (a: number, b: number) => number 이 코드는 타입스크립트의 함수 타입 문법으로, 호출 시그니처(call ..