如何在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

最佳答案 我会尝试这样的事情

declare class MyClass {
    greet(): void;
}

declare type MyClassFactory = (x: string) => MyClass

const factory = (require('./MyClass') as any).MyClass as MyClassFactory;
const a = factory('Bob');

这是分离类及其构造函数

点赞