3

编辑:

换句话说,.d.ts文件中的以下内容不应产生编译器错误 TS2137 'Class "MyClass" does not implement interface "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,这在 d.ts 文件中似乎有点可笑

有谁知道在另一个 CommonJS 模块中声明一个实现接口以供消费的环境类的“正确”方法?

4

1 回答 1

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();

在线尝试

于 2013-08-20T05:21:49.540 回答