2013-08-19 69 views
3

編輯:打字稿0.9.1 CommonJS的:正確聲明出口環境類實現外部接口?

換一種方式.d.ts內的下列文件不應產生編譯器錯誤TS2137 '類 「MyClass的」 不實現接口 「IInterface」':

interface IInterface { 
    someMethod():void; 
} 
declare module "mod" { 
    export class MyClass implements IInterface { 
     constructor(); 
    } 
} 

因爲我不是(也不能在聲明中)執行任何事情。這是編譯器中的一個錯誤還是有其他方式/語法來執行上述內容?我想編譯器足夠聰明,知道精確包括IInterface的簽名作爲MyClass的一部分,而不是要求其方法重新聲明。

ORIGINAL:

我試圖寫的節點組成一個班揚d.ts。在導出實現外部接口的類時遇到問題,特別是擴展節點的EventEmitter的RingBuffer。簡化的問題是(下面在bunyan.d.ts文件):

// this interface declared in <reference..., put inline here for simplicity 
interface IExternal { 
    inheritedMethod():void; 
} 

interface RingBuffer extends IExternal { 
    write():void; 
} 
declare var RingBuffer: { 
    new():RingBuffer; 
} 

declare module "bunyan" { 
    export var RingBuffer; 
} 

然後在myNodeApp.js使用

/// <references path="bunyan.d.ts" /> 

import bunyan = require('bunyan'); 
var rb = new bunyan.RingBuffer(); 

// compiler doesn't error on this; thinks RingBuffer is type any. 
// also, no intellisense to show write() method. 
rb.badFunc(); 

改變bunyan.d.ts到:

declare module "bunyan" { 
    export class RingBuffer { constructor(); } 
} 

編譯,但使用時同樣的問題;沒有智能感知,沒有編譯錯誤。


改變bunyan.d.ts到

declare module "bunyan" { 
    export var RingBuffer:RingBuffer; 
} 

原因編譯錯誤在myNodeApp.js

// error TS2083: Invalid 'new' expression 
import rb = new bunyan.RingBuffer(); 

從bunyan.d.ts除去

declare module "bunyan" { 
    ... 
} 

原因在myNodeApp.js編譯錯誤

// error TS2071: Unable to resolve external module ''bunyan'' 
import bunyan = require('bunyan'); 

改變bunyan.d.ts

interface IExternal { 
    inheritedMethod():void; 
} 
interface IRingBuffer extends IExternal { 
} 

declare module "bunyan" { 
    export class RingBuffer implements IRingBuffer {} 
} 

原因編譯錯誤

// error TS2137: Class "bunyan".RingBuffer declares interface IRingBuffer but 
// does not implement it: type '"bunyan".RingBuffer' is missing property 
// 'inheritedMethod' from type 'IRingBuffer' 

言下之意我不得不重新聲明所有繼承的方法從所有擴展的接口,除了IRingBuffer,這似乎有點可笑在一個d.ts文件

有誰知道「正確」的方式來聲明,用於實現在另一CommonJS的模塊消耗的接口的環境一流的辦??

+0

感謝basarat。什麼是編譯器錯誤?我希望它聲明一個類也可以在d.ts文件中實現一個接口,我不必基本上在類聲明中重新聲明接口。如果在聲明中我說'類MyClass實現了IInterface',它的IInterface的接口簽名應該被隱含,而不必再次輸入... – user2672083

+0

經過進一步調查,我錯了。用解決方法更新了答案:) – basarat

+0

這個[answer](http://stackoverflow.com/a/14587529/1176284)解釋了爲什麼在環境聲明中必須繼承成員聲明。 – rgripper

回答

2

一種替代的方式來定義這將是jQuery的打字稿定義的定義方式。您有單獨的靜態和實例成員接口。下面是一個簡單完整的定義:

interface IExternal { 
    inheritedMethod():void; 
} 

interface IRingBuffer extends IExternal { 
    write():void; 
} 
// Static functions and constructors 
interface IRingBufferStatic{ 
    new():IRingBuffer; 
} 
declare var RingBuffer:IRingBufferStatic; 

declare module "bunyan" { 
    export var RingBuffer:IRingBufferStatic; 
} 

// In the second file 

import bunyan = require('bunyan'); 
var rb = new bunyan.RingBuffer(); 

// you get an error here 
rb.badFunc(); 

Try it online

+1

就是這樣!感謝basarat,非常感謝。 – user2672083