Tôi đang tạo bản đồ đơn giản giữa cấu trúc dữ liệu frontend/backend. Để làm được điều mà tôi đã tạo ra một trang trí trông giống như sau:Chỉ định thuộc tính cho nguyên mẫu không có kiểu trang trí
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
}
}
);
};
}
Và đây là cách tôi sử dụng nó:
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;
}
Vấn đề mà tôi nhìn thấy là thay vì đối tượng thực tế được truyền tới trang trí luôn là nguyên mẫu của nó:
__decorate([
ApiField('yearCompanyFounded')
], VW.prototype, "yearEstablished", void 0);
Điều đó có nghĩa là khi tôi gán công cụ cho cá thể trong trang trí, nó luôn gắn liền với nguyên mẫu lần lượt có nghĩa là các thuộc tính mà tôi muốn được xác định chỉ có cá thể VW
cũng có sẵn trên AbstractCar
và lớp BMW
(trong ví dụ này là yearEstablished
). Điều này làm cho nó không thể có hai thuộc tính có cùng tên nhưng các trường API khác nhau trong hai lớp khác nhau.
Có cách nào để phá vỡ hành vi này không?
ECMAScript 7 ... !!!! – Arjun
Ngoài ra, bạn không cần 'target.apiFieldsBag =' trước '_.assign ('. Bạn cũng có tùy chọn để sử dụng ES6 'Object.assign()' thay vì '_.assign() ' –
Vâng tôi nghĩ rằng khi tôi nhìn lại câu hỏi một lần nữa. Cảm ơn cho người đứng đầu anyway :) –