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); // 타입 에러가 아님