2012-12-25 35 views
4

我正在爲fabric.js提供類型定義文件。的一般結構示出了下面的示例中:使用模塊中的接口作爲類中的字段時的Typescript錯誤

declare module fabric { 
    export interface Canvas { 
     selectionBorderColor: string; 
     selectionColor: string; 
     ... 
    } 

    var Canvas: { 
     new(): Canvas; 
    } 
} 

該模式允許我在一個「接口狀」的方式使用fabric.Canvas,使得變量與fabric.Canvas接口相關聯。同時它允許我調用「靜態成員」(比如fabric.Canvas的構造函數)。

但是,當在類中使用接口「fabric.Canvas」的字段時,會導致問題。下面的示例示出了這種情況下:

Typescript error when using interface from module as field within class

此問題僅放置一個模塊內的界面時,會發生,否則一切工作正常。

此問題的任何解決方案?

回答

2

有一些類型的混淆,因爲你有一個接口和一個同名的字段 - 我知道這在lib.d.ts文件中很常見,但我認爲在編寫新的TypeScript代碼時這不是一個好習慣。這似乎是定義現有代碼的必要條件。

如果您將var Canvas重命名爲var MyCanvas(或其他),則您的代碼有效。

我傾向於用I作爲我的接口的前綴,例如ICanvas - 但這不是TypeScript約定(尚)。

declare module fabric { 
    export class Canvas { 
     selectionBorderColor: string; 
     selectionColor: string; 
    } 
} 

class MyClass { 
    canvas: fabric.Canvas; 
} 
+0

是的,但我正在爲現有的JS庫(Fabric.JS)編寫一個類型定義文件。所以我需要支持像new fabric.Canvas,因爲這是庫所需要的(庫本身不是用腳本編寫的) – ollifant

+0

如果實現在現有的JS庫中,則可以將'interface'關鍵字更改爲'class '。聲明的主體不需要改變,因爲它位於以'declare'關鍵字開頭的模塊中。我已經更新了我的答案來證明這一點。 – Fenton

+0

爲界面使用不同的名稱現在似乎工作。在我的情況下,我現在使用ICanvas作爲接口,使用Canvas作爲聲明(以便新的fabric.Canvas仍然有效)。 – ollifant

相關問題