Búsqueda de sitios web

javascript - ¿Cómo definir una clase con claves dinámicas?


Necesito definir una clase con propiedades dinámicas como 'Methods'. Escribí esto

type Methods = {
    [name:string]:Function
}

class App <M extends Methods> { 
    [name: keyof M] : M[name] // dont work
}

var methods = {
    action : Function,
    move : Function
}

type M = keyof typeof methods;

type myApp = App<typeof methods>;

pero obtengo los siguientes errores. ¿Se pueden arreglar?

El tipo de parámetro de una firma de índice no puede ser un tipo literal ni un tipo genérico. Considere usar en su lugar un tipo de objeto mapeado.

'name' se refiere a un valor, pero se está usando como un tipo aquí. ¿Quisiste decir 'typeof name'?

El tipo de retorno de la firma de índice de la interfaz exportada tiene o está usando un nombre privado 'name'.

Ejemplo reproducible

Respuesta #1

Parece que estás buscando tipos mapeados. Sin embargo, esos solo funcionan para declaraciones de type, no para classes:

type App<M extends Methods> = { 
    [name in keyof M]: M[name];
}

(Demostración completa)

Si realmente quieres definir una clase, necesitas hacerlo con un tipo concreto:

var methods = {
    action: Function,
    move: Function
}
type MyApp = App<typeof methods>;

class TheApp implements MyApp {
    action!: typeof Function;
    move!: typeof Function;
    constructor() {
        Object.assign(this, methods);
    }
}