TypeScript 0.9.1 CommonJS:正确声明实现外部接口的导出环境类?

时间:2013-08-19 20:16:08

标签: class interface typescript commonjs ambient

编辑:

换句话说, .d.ts 文件中的以下内容不应该产生编译器错误TS2137' Class" MyClass"没有实现界面" IInterface"':

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

因为我没有(并且不能在声明中)实施任何事情。这是编译器中的错误还是有其他方法/语法来执行上述含义?我认为编译器足够聪明,可以准确地将IInterface的签名作为MyClass的一部分包含在内,并且不需要重新声明其方法。

ORIGINAL:

我试图为节点组件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(); }
}

编译,但使用时同样的问题;没有intellisense,没有编译错误。


将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文件中似乎有点荒谬

有没有人知道“正确的”&#39;声明一个环境类来实现另一个CommonJS模块中消费的接口的方法吗?

1 个答案:

答案 0 :(得分:2)

定义它的另一种方法是定义Jquery的typescript定义。您有静态和实例成员的单独接口。以下是完整定义示例:

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