私は、/u/blorkfish答えを捨てて、ジェネリックスとES5ゲッター/セッターを使って次のことを考え出しました。
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デフォルトはオプションですが、我々はゲッターとセッターを構築するためにそれを使用するので、それが今では必須です。スローされたエラーによって、これが強制的に実行されます。多分もっと良い方法を考えることができますか?
そして、それを使用する:
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
TypeScriptがジェネリックをサポートするのを待つ必要があるかもしれないと思います。9) –
@RyanCavanaugh現在の答えは受け入れられず、配列のようなもっと複雑なオブジェクトやジェネリックのためのサポートを持つTypeScriptで崩れているかもしれません。 – parliament