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

Seb*_*ian 3 typescript

(这是对这个答案的跟进.)

我正在尝试为现有的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>);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是泛型方法的声明fooOtherModule.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并保留模块名称,我可以编译它,但是接口在现实世界中的不同模块中.

我怎样才能让它正常工作?

Fen*_*ton 5

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

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

你可以下载0.9.5 beta,它有一些bug修复和性能改进(但显然是beta ...但我正在使用它,它似乎稳定).