Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Typescript中编写具有相同名称的类和命名空间声明_Typescript - Fatal编程技术网

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

如何在Typescript中编写具有相同名称的类和命名空间声明,typescript,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);

我使用的第三方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
用这种方法我得到一个编译器错误

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');

这是为了分离类及其构造函数,所以第一个问题是您的声明文件是针对MyClass模块的,它定义了类,但没有描述模块的导出。 第二个问题是,在主模块中需要匹配的import语句<代码>导入。/MyClass'仅用于导入副作用(请参阅

根据工作的代码,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();

感谢这一点-我对其进行了一些修改,以提供
声明类型MyClassFactory=new(x:string)=>MyClass
const a=new factory('Bob');
当我使用TS代码库迁移到webpack时,这对我非常有帮助-在任何地方添加
导出