Podpis indeksu mieszanego maszynopisu ze znanymi właściwościami

Aug 15 2020

Załóżmy, że interfejs ma pewne znane właściwości wraz z ich typami i może mieć dodatkowe z nieznanymi kluczami i innymi typami . coś jak:

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

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

Błąd TS: „Długość właściwości” typu „liczba” nie może być przypisana do typu indeksu ciągu „ciąg”. "

Jak należy wpisać taki interfejs?

Odpowiedzi

3 Eldar Aug 15 2020 at 20:03

[key: string]: string;Dzięki temu Foointerfejs nie będzie miał żadnych właściwości łańcucha. (W twoim przykładzie numer).

Możesz podzielić znane i nieznane właściwości na dwa interfejsy i zdefiniować typ docelowy jako typ unii, jak poniżej:

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

Link do placu zabaw

1 MohamedAllal Oct 18 2020 at 17:16

Sprawdź ten fragment, który dobrze wyjaśnia punkt

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

Możesz sprawdzić ten artykuł, aby uzyskać więcej informacji (wybrałem stamtąd fragment)

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

Za ten element

Posiadanie indeksatorów ciągów i liczb
Nie jest to typowy przypadek użycia, ale mimo to kompilator TypeScript to obsługuje. Jednak ma ograniczenie, że indeksator ciągów jest bardziej rygorystyczny niż indeksator liczb. Jest to celowe, np. W celu umożliwienia pisania takich rzeczy jak: