2017-02-10 123 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();