编辑:
换句话说, .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模块中消费的接口的方法吗?
答案 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();