我正在使用这种格式的第三方Javascript库:
var MyClass = function (name) {
this.name = name;
}
MyClass.prototype.greet = function () {
window.alert('Hello ' + this.name)
}
我想为此编写一个Typescript声明。我有这样的事情:
declare class MyClass {
constructor(name: string);
greet(): void;
}
这一切都很好编译,当我只是想引用它按预期工作的类型。但是我在尝试使用类实现时遇到了问题。
以这种方式使用它,它编译并运行,但我没有编译时检查
const MyClass = (require('./MyClass') as any).MyClass;
const a = new MyClass('Bob'); //a is any
以这种方式使用它会出现编译错误
const MyClass = (require('./MyClass') as any).MyClass as MyClass;
const a = new MyClass('Bob'); //Cannot use 'new' with an expression whose type lacks a call or construct signature.
以这种方式使用它会出现编译错误
import './MyClass';
const a = new MyClass('Bob');
//duplicate identifier in MyClass.d.ts
答案 0 :(得分:1)
我会尝试这样的事情
declare class MyClass {
greet(): void;
}
declare type MyClassFactory = (x: string) => MyClass
const factory = (require('./MyClass') as any).MyClass as MyClassFactory;
const a = factory('Bob');
分离类及其构造函数
答案 1 :(得分:1)
所以第一个问题是你的声明文件是针对MyClass模块并定义了类,但没有描述模块的导出。
第二个问题是您需要在主模块中使用匹配的import语句。 import './MyClass'
仅用于导入副作用(请参阅the typescript modules doc。
基于可行的代码,看起来MyClass模块导出一个具有MyClass属性的对象(设置为MyClass类),以便我将其添加到您的声明文件中。
js模块的MyClass.d.ts
声明文件:
declare class MyClass {
constructor(name: string);
greet(): void;
}
export { MyClass }
然后在main.ts
:
import { MyClass } from './MyClass';
let a = new MyClass('foo');
a.greet();