Firma indice della miscela di dattiloscritti con proprietà note

Aug 15 2020

Supponiamo che l'interfaccia abbia alcune proprietà note con i loro tipi e può averne di aggiuntive con chiavi sconosciute e alcuni altri tipi . qualcosa di simile a:

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

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

Errore TS: "La proprietà" lunghezza "di tipo" numero "non è assegnabile al tipo di indice di stringa" stringa "."

Come dovrebbe essere digitata una tale interfaccia?

Risposte

3 Eldar Aug 15 2020 at 20:03

[key: string]: string;ciò impedisce Fooall'interfaccia di non avere proprietà di stringa. (Nel tuo numero di esempio).

Quello che puoi fare è separare le proprietà note e sconosciute in due interfacce e definire il tuo tipo di destinazione come un tipo di unione come di seguito:

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
};

Collegamento al parco giochi

1 MohamedAllal Oct 18 2020 at 17:16

Dai un'occhiata a questo frammento che spiega bene il punto

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;
}

Puoi controllare questo articolo per maggiori dettagli (ho scelto lo snippet da lì)

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

Per questo elemento

Avere sia indicizzatori di stringhe che di numeri
Questo non è un caso d'uso comune, ma il compilatore TypeScript lo supporta comunque. Tuttavia, ha la restrizione che l'indicizzatore di stringhe è più rigoroso dell'indicizzatore di numeri. Questo è intenzionale, ad esempio, per consentire la digitazione di cose come: