在声明文件中描述mixins

时间:2017-12-31 11:54:42

标签: javascript typescript typescript-typings

假设您要为其创建打字的现有Javascript框架。 Javascript代码使用Node.js模块,原型继承和mixins:

// File: src/lib/a.js

function A() {
  this.isA = true;
  this.type = 'a';
}

module.exports = A;

// File: src/lib/b.js

var A = require('./a');
var plugin = require('./plugin');

function B() {
  A.call(this);
  this.isB = true;
  this.type = 'b';
  plugin(this);
}

B.prototype = object.create(A.prototype);
B.prototype.constructor = B;

module.exports = B;

// File: src/lib/plugin.js

function plugin(obj) {
  obj.doSomethingFancy = function() {
    // ...
  }
}

module.exports = plugin;

您如何在声明文件中描述B,以便传达某些成员是由/通过其构造函数创建的?

1 个答案:

答案 0 :(得分:0)

你真的需要这种区别吗?你的构造函数总是创建那些成员,所以如果你有一个B类型的对象 - 你可以确定那些属性就在那里。

如果您想发信号通知,某个成员可能不存在 - 请使用?为其添加名称,就像我在下面的示例中为doSomethinFancy所做的那样。

class A {
    public isA: boolean;
    public type: string;

    constructor() {
        this.isA = true;
        this.type = 'a';
    }
}

function plugin(obj: any): any {
    obj.doSomethingFancy = function() {
        // ...
    }
}

class B extends A {
    public isB: boolean;

    // same could be used for optional function arguments
    public doSomethingFancy?: () => {};

    constructor() {
        super();
        this.isB = true;
        this.type = 'b';
        plugin(this);
    }
}