我有一个很大的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具有未知属性)。
我能在这做什么吗?最好不必为这个大型库创建定义文件。
答案 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;
}
}