Class TypeScript 0.9.1 CommonJS:是否正确声明了实现外部接口的导出环境类?
编辑: 换句话说,.d.ts文件中的以下内容不应产生编译器错误TS2137“类“MyClass”未实现接口“IIInterface”: 因为我没有(也不能在声明中)实现任何东西。这是编译器中的一个bug,还是有其他方法/语法来实现上面的含义?我认为编译器足够聪明,能够准确地将IInterface的签名作为MyClass的一部分,而不需要重新声明其方法 原件: 我正试图为节点组件bunyan编写一个d.ts。导出实现外部接口的类时遇到问题,特别是扩展节点的EventEmitter的RingBuffer。问题简化如下(在下面的bunyan.d.ts文件中): 编译,但使用时出现相同问题;没有智能感知,没有编译错误Class TypeScript 0.9.1 CommonJS:是否正确声明了实现外部接口的导出环境类?,class,interface,typescript,commonjs,ambient,Class,Interface,Typescript,Commonjs,Ambient,编辑: 换句话说,.d.ts文件中的以下内容不应产生编译器错误TS2137“类“MyClass”未实现接口“IIInterface”: 因为我没有(也不能在声明中)实现任何东西。这是编译器中的一个bug,还是有其他方法/语法来实现上面的含义?我认为编译器足够聪明,能够准确地将IInterface的签名作为MyClass的一部分,而不需要重新声明其方法 原件: 我正试图为节点组件bunyan编写一个d.ts。导出实现外部接口的类时遇到问题,特别是扩展节点的EventEmitter的RingBuff
将bunyan.d.ts更改为
declare module "bunyan" {
export var RingBuffer: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();
// error TS2083: Invalid 'new' expression
import rb = new bunyan.RingBuffer();
// error TS2071: Unable to resolve external module ''bunyan''
import bunyan = require( 'bunyan' );
从bunyan.d.ts移除
declare module "bunyan" {
...
}
interface IExternal {
inheritedMethod():void;
}
interface IRingBuffer extends IExternal {
}
declare module "bunyan" {
export class RingBuffer implements IRingBuffer {}
}
导致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();
// error TS2083: Invalid 'new' expression
import rb = new bunyan.RingBuffer();
// error TS2071: Unable to resolve external module ''bunyan''
import bunyan = require( 'bunyan' );
更换班扬d.ts
declare module "bunyan" {
...
}
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模块中使用的接口的环境类吗?另一种定义它的方法是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();
谢谢你。编译器的错误到底是什么?我希望在d.ts文件中声明一个类来实现一个接口,而不必在类声明中重新声明接口。如果在声明中我说'class MyClass implements IInterface',它的IInterface接口签名应该是隐含的,而不必重新键入…经过进一步的调查,我错了。使用解决方案更新了答案:)这解释了为什么继承的成员声明在环境声明中是必须的。就是这样!谢谢你,非常感谢。