Podpis indeksu mieszanego maszynopisu ze znanymi właściwościami
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
[key: string]: string;
Dzięki temu Foo
interfejs 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
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: