Mecanografiado mezcla firma de índice con propiedades conocidas

Aug 15 2020

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

3 Eldar Aug 15 2020 at 20:03

[key: string]: string;esto evita que la Foointerfaz 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

1 MohamedAllal Oct 18 2020 at 17:16

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: