인터페이스 또는 형식을 Record <string, string>에 할당하는 Typescript

Nov 23 2020

읽은 후 이 질문 또는 이 기사를 , 나는 여전히 사이의 미묘한 차이에 대해 혼란 조금 해요 interfacetype.

이 예에서 내 목표는 단순한 개체를 더 넓은 Record<string, string>유형 에 할당하는 것입니다 .

interface MyInterface {
  foobar: string;
}

type MyType = {
  foobar: string;
}

const exampleInterface: MyInterface = { foobar: 'hello world' };
const exampleType: MyType = { foobar: 'hello world' };

let record: Record<string, string> = {};

record = exampleType;      // Compiles
record = exampleInterface; // Index signature is missing

시도 해봐

를 사용하여 내 개체를 선언 할 때 할당이 가능 type하지만 interface. 그것은 인덱스 서명이 누락되어 있지만 말한다 내 (제한적) 인덱스 서명, 아무도의 이해 MyTypeMyInterface실제로 일이있다.

마지막 줄이 컴파일되지 않고 이전 줄이 컴파일되지 않는 이유는 무엇입니까?

답변

2 ddprrt Nov 23 2020 at 21:51

Record<string, string>와 동일합니다 { [key: string]: string }. 이 인덱스 서명 유형에 하위 집합을 할당 할 수있는 것은 해당 유형의 모든 속성이 알려져 있고이 인덱스 서명에 대해 확인할 수있는 경우에만 가능합니다. 귀하의 경우의 모든 항목 exampleTypeRecord<string, string>. 객체 리터럴 유형은 선언 한 후에는 변경할 수 없으므로 객체 리터럴 유형에 대해서만 확인할 수 있습니다. 따라서 인덱스 서명이 알려져 있습니다.

출처: https://github.com/microsoft/TypeScript/pull/7029

반대로 인터페이스는 선언하는 순간 최종적인 것이 아닙니다. 선언 병합으로 인해 항상 동일한 인터페이스에 새 멤버를 추가 할 가능성이 있습니다.