데코레이터(decorator) 데코레이터(decorator)는 TypeScript의 실험적 기능으로 클래스, 클래스 메서드, 프로퍼티, 메서드 매개변수를 활용한 메타 프로그래밍에 깔끔한 문법을 제공합니다. 데코레이터는 장식하는 대상의 함수를 호출하는 기능을 제공하는 문법입니다. 예제를 통해 데코레이터가 어떻게 동작하는지 알아보겠습니다. @serializable class APIPayload { getValue(): Payload { // ... } } 클래스 데코레이터인 @serializable은 APIPayload 클래스를 감싸고 있으며 선택적으로 이를 대체하는 새 클래스를 반환합니다. 데코레이터를 사용하지 않고 같은 기능을 아래처럼 구현할 수도 있습니다. let APIPayload = serializ..
믹스인(mixin) JavaScript와 TypeScript는 trait이나 mixin 키워드를 제공하지 않지만 쉽게 직접 구현할 수 있습니다. 두 키워드 모두 둘 이상의 클래스를 상속받는 다중 상속(multiple inheritance)과 관련된 기능을 제공하며, 역할 지향 프로그래밍(role-oriented programming)을 제공합니다. 역할 지향 프로그래밍에선 "이것은 Shape이에요"라고 표현하는 대신 "측정할 수 있어요", "반지름을 가지고 있어요"처럼 속성을 묘사하는 방식을 사용합니다. 즉, "is-a" 관계 대한 'can', 'has-a' 관계를 사용합니다. 믹스인을 구현해 보겠습니다. 믹스인이란 동작과 프로퍼티를 클래스로 혼합(mix)할 수 있게 해주는 패턴으로, 다음 규칙을 따릅니..
다형성 함수와 타입처럼, 클래스와 인터페이스도 기본값과 상한/하한 설정을 포함한 다양한 제네릭 타입 매개변수 기능을 지원합니다. 제네릭 타입의 범위는 클래스나 인터페이스 전체가 되게 할 수도 있고 특정 메서드로 한정할 수도 있습니다. class FirstMap{ // ① constructor(initialKey: K, initialValue: V){ // ② // ... } get(key: K): V { // ③ // ... } set(key: K, value: V){ // ... } merge(map: FirstMap): FirstMap{ // ④ // ... } static of(k: K, v: V): FirstMap{ // ⑤ // ... } } class와 함께 제네릭을 선언했으므로 클래스 전체에..
클래스는 값과 타입을 모두 선언한다 TypeScript의 거의 모든 것은 값 아니면 타입입니다. // 값 let a = 1999 function b(){} // 타입 type a = number interface b { (): void } 값과 타입은 TypeScript에서 별도의 네임스페이스에 존재합니다. 용어를 어떻게 사용하는지를 보고 TypeScript가 알아서 이를 값 또는 타입으로 해석합니다. // 값 let a = 1999 function b(){} // 타입 type a = number interface b { (): void } if(a + 1 > 3){ // 문맥상 값 a로 추론 let x: a = 3 // 문맥상 타입 a로 추론 } 문맥을 파악해 해석하는 이 기능은 정말 유용합니다. 한..