我想出了以下使用泛型和ES5 getters/setters,構建了/u/blorkfish答案。
class TypedModel<t> extends Backbone.Model {
constructor(attributes?: t, options?: any) {
super(attributes, options);
var defaults = this.defaults();
for (var key in defaults) {
var value = defaults[key];
((k: any) => {
Object.defineProperty(this, k, {
get:(): typeof value => {
return this.get(k);
},
set: (value: any) => {
this.set(k, value);
},
enumerable: true,
configurable: true
});
})(key);
}
}
public defaults(): t {
throw new Error('You must implement this');
return <t>{};
}
}
注:Backbone.Model默認值是可選的,但由於我們用它來構建getter和setter,現在是強制性的。拋出的錯誤迫使你這樣做。也許我們可以想一個更好的方法?
,並使用它:
interface IFoo {
name: string;
bar?: number;
}
class FooModel extends TypedModel<IFoo> implements IFoo {
public name: string;
public bar: number;
public defaults(): IFoo {
return {
name: null,
bar: null
};
}
}
var m = new FooModel();
m.name = 'Chris';
m.get('name'); // Chris
m.set({name: 'Ben', bar: 12});
m.bar; // 12
m.name; // Ben
var m2 = new FooModel({name: 'Calvin'});
m2.name; // Calvin
這是理想的稍微詳細,它要求你使用默認值,但它工作得很好。
沒有答案,但我發現了同樣的問題,並用一組不同的工具來管理數據和綁定(普通但強類型的TS對象+ Linq。 js + jsrender/jsviews(帶有可觀察類 - http://bit.ly/WyNbhn))。參考:http://linqjs.codeplex.com/ https://github.com/BorisMoore – JcFx 2013-03-08 16:10:02
我想你可能需要等待TypeScript支持泛型以一種理智的方式做到這一點(v0。9) – 2013-03-08 17:29:31
@RyanCavanaugh現在的答案是不被接受的,因爲像數組這樣更復雜的對象會崩潰,現在TypeScript支持泛型,也許你可以提供一個更新的答案? – parliament 2013-08-21 21:03:54