아이템 53 : 타입스크립트 기능보다는 ECMAScript 기능을 사용하기

  1. 열거형(Enum)

    열거형을 사용할 때는 주의해야 한다.

    const enum Flavor {
        VANILLA = 0,
        CHOCOLATE = 1
    }
    
    console.log(Flavor.CHOCOLATE)
    
    enum Flavor2 {
        VANILLA = 0,
        CHOCOLATE = 1
    }
    
    console.log(Flavor2.CHOCOLATE)
    

    위 결과로 컴파일러는 Flavor.CHOCOLATE를 1로 인식한다.

    이는 완전 다른 결과이므로 const enum을 쓸 때는 주의해야 하며, 가급적 사용을 지양해야 한다.

    Untitled

  2. 매개변수

    타입 스크립트는 매개변수에 속성을 추가하여 간결한 문법을 만들 수 있다.

    class Person {
    	constructor(public name: string) {}
    }
    

    문법은 간결해지지만, 컴파일 이후 실제 코드가 늘어나게 된다.

    Untitled

    또한, 매개변수와 일반속성을 섞어 쓸 경우 설계에 혼란이 생기기 쉽다.

  3. 데코레이터

    데코레이터는 현재까지도 표준이 아니다.

    호환성이 깨지기 쉬워 사용에 유의해야 한다.

    <aside> ✅ DI 와 연관된 내용

    </aside>

아이템 54 : 객체를 순회하는 노하우

const obj = {
	one: 'uno',
	two: 'dos',
	three: 'tres',
}

for (const k in obj) {
	const v = obj[k]; // obj에 인덱스 시그니처가 없기 때문에 
										// 엘리먼트는 암시적으로 'any' 타입입니다.
}

에러가 발생하는 원인은 k의 타입은 string이지만,

obj 객체는 ‘one’, ‘two’, ‘three’ 세 개의 키만 존재하기 때문이다. 키 타입이 서로 다르게 추론되어 발생한 오류이다.

let k: keyof typeof obj
for (k in obj) {
	const v = obj[k]; // 정상
}

<aside> ❓ index signature란?

</aside>

interface ABC {
	a: string;
	b: string;
	c: number;
}

function foo(abc: ABC) {
	for (const k in abc) {
		const v = abc[k]; // ABC 타입에 인덱스 시그니처가 어벗기 때문에
											// 엘리먼트는 암시적으로 'any'가 됩니다.
	}
}

----

const x = {a:'a', b:'b', c:'c', d:new Date()};
foo(x); // 정상

foo 함수가 오류가 발생하는 이유는,

foo함수에 값을 전달할 때 ABC 타입을 포함하는 더 넓은 타입을 허용하기 때문이다.

Object.entries를 사용해 복잡하지 않게 사용할 수 있다.