打字稿编译器错误“通用类型需要0类型参数”

时间:2013-12-03 11:11:58

标签: typescript

(这是this answer的后续行动。)

我正在尝试为现有的Javascript库构建一个打字稿定义文件。我遇到的困难与:

的组合有关
  • 嵌套类型
  • 泛型
  • 命名构造函数(与嵌套类型非常相似)

这是我试图在lib.d.ts库定义文件中编译的代码:

declare module MyModule {
    export class SomeClass<T> {
        new(); // default (unnamed) constructor for SomeClass
        static WithEnumValue: {  // "named constructor" for SomeClass
            new <T>(enumValue: MyModule.SomeClass.SomeEnum): SomeClass<T>;
        };
    }

    export module SomeClass {
        export enum SomeEnum { VALUE_A, B, C }
    }
}

declare module OtherModule {
    export interface OtherInterface {
        foo<T>(inst: MyModule.SomeClass<T>);
    }
}

问题是在foo

中声明通用方法OtherModule.OtherInterface

使用上面的代码我得到了这个奇怪的编译器输出(使用tsc编译器0.9.1.1):

error TS2090: Generic type 'MyModule.SomeClass' requires 0 type argument(s).

显然很难用0类型参数声明泛型类型,因为<>和没有类型参数MyModule.SomeClass的变体都不起作用 - 后者会给出这个有点矛盾的错误:

error TS2173: Generic type references must include all type arguments.

如果我在OtherInterface内声明MyModule并忘记模块名称,我可以编译它,但接口在现实世界的不同模块中。

如何让它正常工作?

1 个答案:

答案 0 :(得分:5)

这看起来像编译器错误 - 编译器没有意识到您正在尝试使用名为SomeClass的类而不是名为SomeClass的模块。

好消息是你的声明实际上是好的,编译器的下一个版本(0.9.5)将非常满意。

你可以download the 0.9.5 beta,它有一些错误修复和性能改进(但显然是测试版...但我正在使用它,它看起来很稳定)。