編輯:打字稿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的模塊消耗的接口的環境一流的辦??
感謝basarat。什麼是編譯器錯誤?我希望它聲明一個類也可以在d.ts文件中實現一個接口,我不必基本上在類聲明中重新聲明接口。如果在聲明中我說'類MyClass實現了IInterface',它的IInterface的接口簽名應該被隱含,而不必再次輸入... – user2672083
經過進一步調查,我錯了。用解決方法更新了答案:) – basarat
這個[answer](http://stackoverflow.com/a/14587529/1176284)解釋了爲什麼在環境聲明中必須繼承成員聲明。 – rgripper