TypeScript类是否从JS对象继承而没有完整的定义

时间:2015-09-16 14:57:59

标签: inheritance typescript

我有一个很大的JS库,它是一个依赖项。它没有TypeScript定义文件,并且制作一个文件非常麻烦。作为一种解决方法,我们使用了以下定义文件,它实际上只是禁用该库的类型检查:

declare var library: any;

我需要从这个库中扩展一个对象。目前这是通过vanilla JS继承完成的:

function Bar(argument: any) {
    library.Foo.call(this, argument);

    // Other properties...
};
Bar.prototype = Object.create(library.Foo.prototype);
Bar.prototype.constructor = Bar;

我想将其转换为使用TypeScript的class语法,以便与我的其余TS代码保持一致,因为我发现语法更清晰,更易读。我希望它是这样的:

class Bar extends library.Foo {
    constructor(argument: any) {
        super(argument);
    }

    // Other properties...
}

但这失败了,错误“找不到命名空间'库'',尽管事实上我可以在其他地方使用像library.Whatever之类的东西而没有问题(感谢定义文件声明{{1具有未知属性)。

我能在这做什么吗?最好不必为这个大型库创建定义文件。

1 个答案:

答案 0 :(得分:0)

一个类只能从另一个类扩展。这就是为什么如果你想坚持你的风格(编写类定义而不是JS继承),你需要创建一个表示Foo的类并将其与现有类合并。 e.g。

declare var library: any|ILibrary;

function mix(target: any, ingredients: any[]) {
    ingredients.forEach(e => {
        Object.getOwnPropertyNames(e.prototype).forEach(f => {
            target.prototype[f] = e.prototype[f];
        });
    });
}

interface ILibrary {
    Foo: Bar|any;
}

class Bar {

}
mix(library.Foo, [Bar]);

通过此设置,我们可以向Bar类添加内容,它将合并到library.Foo。如果我们要添加一个函数help,我们可以通过library.Foo.help()调用它。问题是我们无法使用任何本地成员,因为Bar没有定义它。 e.g。

class Bar {
    version: number; // something from the JS library
    getVersion() {
        return this.version;
    }
}