열거형(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을 쓸 때는 주의해야 하며, 가급적 사용을 지양해야 한다.
매개변수
타입 스크립트는 매개변수에 속성을 추가하여 간결한 문법을 만들 수 있다.
class Person {
constructor(public name: string) {}
}
문법은 간결해지지만, 컴파일 이후 실제 코드가 늘어나게 된다.
또한, 매개변수와 일반속성을 섞어 쓸 경우 설계에 혼란이 생기기 쉽다.
데코레이터
데코레이터는 현재까지도 표준이 아니다.
호환성이 깨지기 쉬워 사용에 유의해야 한다.
<aside> ✅ DI 와 연관된 내용
</aside>
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를 사용해 복잡하지 않게 사용할 수 있다.