我们大量使用带有 TypeScript 的骨干网,并提出了一个新颖的解决方案。
考虑以下代码:
interface IListItem {
Id: number;
Name: string;
Description: string;
}
class ListItem extends Backbone.Model implements IListItem {
get Id(): number {
return this.get('Id');
}
set Id(value: number) {
this.set('Id', value);
}
set Name(value: string) {
this.set('Name', value);
}
get Name(): string {
return this.get('Name');
}
set Description(value: string) {
this.set('Description', value);
}
get Description(): string {
return this.get('Description');
}
constructor(input: IListItem) {
super();
for (var key in input) {
if (key) {
//this.set(key, input[key]);
this[key] = input[key];
}
}
}
}
请注意,接口定义了模型的属性,构造函数确保传递的任何对象都具有 Id、Name 和 Description 属性。for 语句只是调用每个属性上的主干集。这样以下测试将通过:
describe("SampleApp : tests : models : ListItem_tests.ts ", () => {
it("can construct a ListItem model", () => {
var listItem = new ListItem(
{
Id: 1,
Name: "TestName",
Description: "TestDescription"
});
expect(listItem.get("Id")).toEqual(1);
expect(listItem.get("Name")).toEqual("TestName");
expect(listItem.get("Description")).toEqual("TestDescription");
expect(listItem.Id).toEqual(1);
listItem.Id = 5;
expect(listItem.get("Id")).toEqual(5);
listItem.set("Id", 20);
expect(listItem.Id).toEqual(20);
});
});
更新:
我更新了代码库以使用 ES5 get 和 set 语法,以及构造函数。基本上,您可以使用 Backbone .get 和 .set 作为内部变量。