Typoskript, das einem Datensatz <Zeichenfolge, Zeichenfolge> eine Schnittstelle oder einen Typ zuweist

Nov 23 2020

Nachdem ich diese Frage oder diesen Artikel gelesen habe , bin ich immer noch etwas verwirrt über die subtilen Unterschiede zwischen an interfaceund a type.

In diesem Beispiel ist es mein Ziel, ein einfaches Objekt einem breiteren Record<string, string>Typ zuzuweisen :

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

Versuch es

Die Zuordnung ist möglich, wenn mein Objekt mit a deklariert typewird, nicht jedoch, wenn ein ähnliches Objekt mit a deklariert wird interface. Es heißt, dass die Indexsignatur fehlt, aber nach meinem (eingeschränkten) Verständnis von Indexsignaturen keine MyTypeund MyInterfacetatsächlich eine.

Was ist der Grund, warum die letzte Zeile nicht kompiliert wird, während die vorherige Zeile kompiliert?

Antworten

2 ddprrt Nov 23 2020 at 21:51

Record<string, string>ist das gleiche wie { [key: string]: string }. Eine Teilmenge, die diesem Indexsignaturtyp zugewiesen werden darf, ist nur möglich, wenn alle Eigenschaften dieses Typs bekannt sind und mit dieser Indexsignatur verglichen werden können. In Ihrem Fall ist alles von exampleTypezuweisbar Record<string, string>. Dies kann nur für Objektliteraltypen überprüft werden, da Objektliteraltypen nicht geändert werden können, sobald Sie sie deklariert haben. Somit ist die Indexsignatur bekannt.

Quelle: https://github.com/microsoft/TypeScript/pull/7029

Im Gegensatz dazu sind Schnittstellen nicht endgültig, sobald Sie sie deklarieren. Durch das Zusammenführen von Deklarationen besteht immer die Möglichkeit, neue Mitglieder zur gleichen Schnittstelle hinzuzufügen.