如何定义动态创建的方法?

时间:2015-04-02 23:58:13

标签: typescript

我有一个类:

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');

你现在对这个用例有什么好的解决方案吗?

1 个答案:

答案 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如果您能提出提案,那就太棒了