Typescript: Asignar Propiedades Dinámicamente en una Clase
Tengo una clase que vincula datos variables a su instancia.
class RouteData{
constructor(data: Object) {
// binding object attributes to instance
Object.keys(data).forEach((key) => { this[key] = data[key];})
}
}
let route: RouteData = new RouteData({hello: "test"})
console.log(route.hello);
El resultado de lo anterior es test.
Sin embargo, obtengo un error al compilar.
example.ts(9,19): error TS2339: Property 'hello' does not exist on type 'RouteData'.¿Cómo puedo declarar el tipo de esta clase para permitir la vinculación de cualquier propiedad en su clase?
Respuesta #1
Agrega un casting antes.
console.log((<any>route).hello);
Respuesta #2
Recomiendo declarar las interfaces como:
interface IHello {
hello: string;
}
interface IRouteDataHello extends RouteData, IHello { }
let route = <IRouteDataHello>new RouteData(<IHello>{ hello: "test" })
console.log(route.hello);
Esto hace que el compilador realice comprobaciones estáticas y te permita refactorizar el código con facilidad (para eso es TypeScript). Por supuesto, no es importante para un proyecto pequeño.
Por ejemplo, en lugar de IHello puede ser un objeto más complejo:
interface IRouteData<T> {
path: string;
component: { new () };
as?: string;
data?: T;
}
