Mecanografiado mezcla firma de índice con propiedades conocidas
Digamos que la interfaz tiene algunas propiedades conocidas con sus tipos, y puede tener otras adicionales con claves desconocidas y algunos otros tipos . algo como:
interface Foo {
lenght: number;
[key: string]: string;
}
const foo : Foo = {
lenght: 1,
txt: "TXT",
};
Error de TS: "La propiedad 'longitud' del tipo 'número' no se puede asignar al tipo de índice de cadena 'cadena'".
¿Cómo se debe escribir una interfaz de este tipo?
Respuestas
[key: string]: string;
esto evita que la Foo
interfaz no tenga propiedades de cadena. (En su número de ejemplo).
Lo que puede hacer es separar las propiedades conocidas y desconocidas en dos interfaces y definir su tipo de destino como un tipo de unión como se muestra a continuación:
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
};
Enlace de juegos
Mira este fragmento, explica bien el 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;
}
Puede consultar este artículo para obtener más detalles (elegí el fragmento de allí)
https://basarat.gitbook.io/typescript/type-system/index-signatures
Para este elemento
Tener indexadores de cadenas y de números
Este no es un caso de uso común, pero el compilador TypeScript lo admite. Sin embargo, tiene la restricción de que el indexador de cadenas es más estricto que el indexador de números. Esto es intencional, por ejemplo, para permitir escribir cosas como: