Sto costruendo una semplice mappatura tra struttura dati frontend/backend. Per fare questo ho creato un decoratore che è simile al seguente:Assegnazione di proprietà a non prototipo con decoratori
function ApiField(
apiKey: string,
setFn: (any) => any = (ret) => ret,
getFn: (any) => any = (ret) => ret
) {
return function (target: AbstractModel, propertyKey: string) {
target.apiFieldsBag = target.apiFieldsBag || {};
_.assign(
target.apiFieldsBag,
{
[propertyKey]: {
apiKey: apiKey,
setFn: setFn,
getFn: getFn
}
}
);
};
}
E questo è come lo uso:
class AbstractCar {
@ApiField('id')
public id: string = undefined;
}
class BMW extends AbstractCar {
@ApiField('cylinders')
public cylinderCount: number;
}
class VW extends AbstractCar {
@ApiField('yearCompanyFounded')
public yearEstablished: number;
}
Il problema che sto vedendo è che invece di l'oggetto reale di essere passato al decoratore è sempre il suo prototipo:
__decorate([
ApiField('yearCompanyFounded')
], VW.prototype, "yearEstablished", void 0);
il che significa che, come sto assegnando roba per l'istanza nella decoratore, è sempre attaccato al prototipo a sua volta significa che le proprietà che voglio definire solo l'istanza VW
sono disponibili anche su AbstractCar
e sulla classe BMW
(in questo esempio, questo sarebbe yearEstablished
). Ciò rende impossibile avere due proprietà con lo stesso nome ma campi API diversi in due classi diverse.
C'è un modo per aggirare questo comportamento?
ECMAScript 7 ... !!!! – Arjun
Come parte, non è necessario 'target.apiFieldsBag =' davanti a '_.assign ('. Hai anche la possibilità di usare ES6 'Object.assign()' invece di '_.assign() ' –
Sì, l'ho capito mentre guardavo di nuovo la domanda.Grazie per l'avviso comunque :) –