如何在Typescript中为具有相同名称的类和命名空间编写声明

时间:2017-02-10 17:35:06

标签: typescript

我正在使用这种格式的第三方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

2 个答案:

答案 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();