我有一个类:
class Shape {
attrs : any = {};
getWidth() : number {
return this.attrs.x * 2;
}
/*some code*/
}
该课程有很多getter和setters方法,例如getProperty()
和setProperty()
。几乎所有这些都以相同的方式工作,但具有不同的属性。为了避免类定义中的大量代码重复,我动态添加了这些方法:
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function addGetter(constructor, attr, defaultValue) : void {
var method = 'get' + capitalize(attr);
constructor.prototype[method] = function() {
var val = this.attrs[attr];
return val === undefined ? defaultValue : val;
};
}
// then add a lot of getters in fast way
addGetter(Shape, 'x');
// now we have shape.getX();
addGetter(Shape, 'y');
// now we have shape.getY();
它对javascript非常有用。但是类型呢?我不能做同样的事情,因为我会有一个错误:
var shape = new Shape();
shape.getX(); // Property 'getX' does not exist on type 'Shape'.
我知道我可以创造"假的"然后在类定义中的方法覆盖它。但看起来很难看:
class Shape {
attrs : any = {};
getWidth() : number {
return (this.attrs.x || 0) * 2;
}
// fake method
getX() : number {
return 0;
}
/*some code*/
}
// then overwrite
addGetter(Shape, 'x');
你现在对这个用例有什么好的解决方案吗?
答案 0 :(得分:3)
function addGetter(constructor,attr,defaultValue):void
这实际上是mixin
。目前在TypeScript中没有关于mixins的好故事。有关于如何键入它的文档:https://github.com/Microsoft/TypeScript/wiki/Mixins
您基本上声明这些成员存在但不提供实施。
class Shape {
attrs : any = {};
getWidth() : number {
return (this.attrs.x || 0) * 2;
}
// declared only
getX: ()=> number;
/*some code*/
}
// then define
addGetter(Shape, 'x');
Mixins在2.0的路线图中:http://github.com/Microsoft/TypeScript/wiki/Roadmap#20此外,您可以在此处开始讨论:http://github.com/Microsoft/TypeScript/issues如果您能提出提案,那就太棒了