인터페이스 또는 형식을 Record <string, string>에 할당하는 Typescript
읽은 후 이 질문 또는 이 기사를 , 나는 여전히 사이의 미묘한 차이에 대해 혼란 조금 해요 interface
와 type
.
이 예에서 내 목표는 단순한 개체를 더 넓은 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
. 그것은 인덱스 서명이 누락되어 있지만 말한다 내 (제한적) 인덱스 서명, 아무도의 이해 MyType
와 MyInterface
실제로 일이있다.
마지막 줄이 컴파일되지 않고 이전 줄이 컴파일되지 않는 이유는 무엇입니까?
답변
Record<string, string>
와 동일합니다 { [key: string]: string }
. 이 인덱스 서명 유형에 하위 집합을 할당 할 수있는 것은 해당 유형의 모든 속성이 알려져 있고이 인덱스 서명에 대해 확인할 수있는 경우에만 가능합니다. 귀하의 경우의 모든 항목 exampleType
을 Record<string, string>
. 객체 리터럴 유형은 선언 한 후에는 변경할 수 없으므로 객체 리터럴 유형에 대해서만 확인할 수 있습니다. 따라서 인덱스 서명이 알려져 있습니다.
출처: https://github.com/microsoft/TypeScript/pull/7029
반대로 인터페이스는 선언하는 순간 최종적인 것이 아닙니다. 선언 병합으로 인해 항상 동일한 인터페이스에 새 멤버를 추가 할 가능성이 있습니다.