2015-08-07 13 views
6

Ho una classe che associa i dati variabili alla sua istanza.Typescript: Assegna dinamicamente le proprietà alla classe

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); 

Il risultato di quanto sopra è test.

Tuttavia, durante la compilazione viene visualizzato un errore.

example.ts(9,19): error TS2339: Property 'hello' does not exist on type 'RouteData'.

Come posso dichiarare il tipo di questa classe per consentire per il legame di ogni altro bene sulla sua classe.

risposta

6

Aggiungere un cast prima.

console.log((<any>route).hello); 
3

vi consiglio di dichiarare interfacce come:

interface IHello { 
    hello: string; 
} 

interface IRouteDataHello extends RouteData, IHello { } 

let route = <IRouteDataHello>new RouteData(<IHello>{ hello: "test" }) 

console.log(route.hello); 

Questo rende compilatore per un controllo statico e ti permettono di refactoring del codice con facilità (questo è quello che è per dattiloscritto). Ovviamente non è importante per un piccolo progetto.

Ad esempio, invece di IHello esso può essere oggetto più complesso:

interface IRouteData<T> { 
    path: string; 
    component: { new() }; 
    as?: string; 
    data?: T; 
} 
+0

Grazie per la @Artem feedback. Il motivo per cui sto provando in questo modo è perché i binding che sto applicando sono sconosciuti. Non sono sicuro se ciao sarà il nome della chiave o che sarà una stringa. Vedere i dati. 'new Route ({percorso: '/ bozze', componente: DraftsCmp, come: 'bozze', dati: {isAdmin: falso}})' –

Problemi correlati