2017-02-10 126 views
2

写声明类和命名空间具有相同名称的我使用的是第三方JavaScript库,格式如下:如何在打字稿

var MyClass = function (name) { 
    this.name = name; 
} 

MyClass.prototype.greet = function() { 
    window.alert('Hello ' + this.name) 
} 

我想写这个打字稿声明。我有这样的事情:

​​

这是所有编译罚款,当我只想引用它按预期工作的类型。但是我在尝试使用类实现时遇到了问题。

使用这种方式,它编译和运行,但我没有得到任何编译时检查

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 

回答

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

感谢您为此 - 我修改了这一点给'声明类型MyClassFactory = new(x:string)=> MyClass'和'const a = new factory('Bob');'' – tarling

0

所以第一个问题是,你的宣言文件是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();