Búsqueda de sitios web

Cómo crear una interfaz genérica Map en TypeScript


Me gustaría crear una interfaz Map en TypeScript, pero no puedo parecer averiguar cómo restringir el accesorio de propiedades para complacer al compilador

Interfaz deseada

export interface IMap<I extends string | number, T> {
  [property: I]: T;
}

Error :

Un tipo de firma de índice debe ser 'string' o 'number'

Respuesta #1

Se le permite definir tanto una firma de índice de cadena como numérica.

Según la especificación:

Un tipo de objeto puede contener como máximo una firma de índice de cadena y una firma de índice numérico.

Entonces puedes hacer esto:

interface IMap<T> {
    [index: string]: T;
    [index: number]: T;
} 

¿Eso era lo que buscabas?

Además, cuando defines solo una firma de índice de cadena:

Específicamente, en un tipo con una firma de índice de cadena de tipo T, todas las propiedades y las firmas de índice numéricas deben tener tipos que sean asignables a T.

Y así:

class Foo {
    [index: string]: number;
}

let f = new Foo();

f[1] = 1; //OK

f[6] = "hi"; //ERROR: Type 'string' is not assignable to type 'number'

Artículos relacionados