Typoskript-Mix-Index-Signatur mit bekannten Eigenschaften

Aug 15 2020

Angenommen, die Schnittstelle verfügt über einige bekannte Eigenschaften mit ihren Typen und kann zusätzliche Eigenschaften mit unbekannten Schlüsseln und einige andere Typen haben . etwas wie:

interface Foo {
  lenght: number;
  [key: string]: string;
}

const foo : Foo = {
  lenght: 1,
  txt: "TXT",
};

TS-Fehler: "Die Eigenschaft 'Länge' vom Typ 'Nummer' kann nicht dem Zeichenfolgenindex Typ 'Zeichenfolge' zugewiesen werden."

Wie soll eine solche Schnittstelle eingegeben werden?

Antworten

3 Eldar Aug 15 2020 at 20:03

[key: string]: string;Dadurch wird verhindert, dass die FooSchnittstelle keine Zeichenfolgeneigenschaften aufweist. (In Ihrer Beispielnummer).

Sie können die bekannten und unbekannten Eigenschaften in zwei Schnittstellen aufteilen und Ihren Zieltyp als Vereinigungstyp wie folgt definieren:

interface Foo {      
  lenght: number;
}

interface Bar {
    [key: string]: string ;
}

type FooBar = Foo | Bar;

const foo : FooBar = {
  lenght: 1, // its ok defined in foo
  txt: "TXT", // string is ok
  baz : 3 // error because its not string
};

Spielplatz Link

1 MohamedAllal Oct 18 2020 at 17:16

Schauen Sie sich dieses Snippet an, das den Punkt gut erklärt

interface ArrStr {
  [key: string]: string | number; // Must accommodate all members

  [index: number]: string; // Can be a subset of string indexer

  // Just an example member
  length: number;
}

Sie können diesen Artikel für weitere Details überprüfen (ich habe das Snippet von dort ausgewählt)

https://basarat.gitbook.io/typescript/type-system/index-signatures

Für dieses Element

Sowohl Zeichenfolgen- als auch Zahlenindexer haben
Dies ist kein häufiger Anwendungsfall, aber der TypeScript-Compiler unterstützt ihn trotzdem. Es gibt jedoch die Einschränkung, dass der Zeichenfolgenindexer strenger ist als der Zahlenindexer. Dies ist beabsichtigt, um beispielsweise das Schreiben von Dingen wie: zu ermöglichen.