3

編集:

別の言い方をすれば、.d.tsファイル内で次のコードを実行しても、コンパイラ エラー TS2137 'クラス "MyClass" はインターフェイス "IInterface" を実装していません' が生成されません。

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

私は何も実装していない(そして宣言することはできない)からです。これはコンパイラのバグですか、それとも上記が意味することを行うための他の方法/構文はありますか? コンパイラは、IInterface の署名を MyClass の一部として正確にインクルードし、そのメソッドを再宣言する必要がないことを十分に認識していると思います。

オリジナル:

ノード コンポーネント bunyan の 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 を除いて、すべての拡張インターフェイスから継承されたすべてのメソッドを再宣言する必要があることを暗示しています。

別のCommonJSモジュールで消費するためのインターフェースを実装するアンビエントクラスを宣言する「正しい」方法を知っている人はいますか??

4

1 に答える 1