아래 예제는 정상적으로 실행은 되지만, 편집기에서는 오류가 발생합니다.
const obj = {
one: 'uno',
two: 'dos',
three: 'tres',
};
for (const k in obj) {
const v = obj[k]; //에러) obj에 인덱스 시그니처가 없기 때문에 엘리먼트는 암시적으로 'any' 타입임.
}
|
원인은 obj의 타입은 'one' 'two' 'three' 속성만 허용하는 타입이지만 for 이터레이션의 k 변수의 타입은 string타입으로 추론되었기 때문입니다.
k 변수가 string으로 추론되는 원인은 무엇일까요?
왜냐하면 타입스크립트 타입 체커는 'obj' 속성에 언제든 새로운 속성이 추가될 수 있다는 것을 알고 있기 때문입니다.
obj 객체에 'four'과 같은 속성들이 언제든지 추가가 될 수 있기 때문에 타입 추론을 string으로 합니다.
위 예제의 k 타입을 좀더 구체적으로 명시해주면 오류는 사라집니다.
const obj = {
one: 'uno',
two: 'dos',
three: 'tres',
};
let k: keyof typeof obj; // 타입이 "one" | "two" | "three";
for (k in obj) {
const v = obj[k]; //정상
}
|
위와 같은 방법으로 객체를 순회하는 것은 무언가 불편해 보입니다. 더 쉽게 하는 방법이 있는데 아래의 예제를 봅시다.
Object.entries()를 활용하면 객체 순회하는데 복잡하지 않습니다.
const obj = {
one: 'uno',
two: 'dos',
three: 'tres',
};
for (const k in obj) {
console.log(obj[k]); // 비정상
}
for (const [key, value] of Object.entries(obj)){
console.log(value); // 정상
}
|
'IT' 카테고리의 다른 글
Effective Typescript - 1 - 타입스크립트와 자바스크립트의 관계 이해하기 (0) | 2022.01.24 |
---|---|
Effective Typescript - 56 - 정보를 감추는 목적으로 private 사용하지 않기 (0) | 2022.01.24 |
Effective Typescript - 53 - 타입스크립트 기능보다는 ECMAScript 기능을 사용하기 (0) | 2022.01.24 |
Effective Typescript - 52 - 테스팅 타입의 함정에 주의하기 (0) | 2022.01.24 |
Effective Typescript - 51 - 의존성 분리를 위해 미러 타입 사용하기 (0) | 2022.01.24 |