https://medium.com/@yujso66/번역-왜-타입스크립트는-object-keys의-타입을-적절하게-추론하지-못할까요-477253b1aafa
Why doesn't TypeScript properly type Object.keys?
const obj = {
a: 1,
b: 2,
};
const k = Object.keys(obj);
obj[k]; // Type 'string[]' cannot be used as an index type.(2538)
왜 에러가 발생하는 것일까요?
Object.keys
의 타입정의를 살펴보면 다음과 같습니다.
// typescript/lib/lib.es5.d.ts
interface Object {
keys(o: object): string[];
}
왜 이렇게 했을까요?
class Object {
keys<T extends object>(o: T): (keyof T)[];
}
만약 keys 메소드의 타입이 이랬다면 타입에러가 발생하지 않았을 것입니다. 그럼 타입스크립트는 왜 이렇게 했을까요?
타입스크립트가 구조적 타입 시스템 (Structurally typed interfaces)을 가지고 있기 때문입니다. (Go언어 또한 그러함)
타입스크립트는 프로퍼티가 누락 되었거나 잘못된 타입일 때 에러를 표시합니다.
그러나 타입스크립트는 추가 프로퍼티가 포함되어 있어도 에러를 표시하지 않습니다.
function saveUser(user: { name: string; age: number }) {}
const user = { name: 'Alex', age: 25, city: 'Reykjavík' };
saveUser(user); // 타입 에러가 아님