在TypeScript中调用泛型类的静态函数

Dre*_*kes 10 typescript

给定一个Foo<T>带有静态factory方法的泛型类:

class Foo<T>
{
    public static factory(item: T): Foo<T>
    {
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这不编译?

var f = Foo<number>.factory(1);
Run Code Online (Sandbox Code Playgroud)

错误消息:

错误TS2069:参数列表必须遵循泛型类型参数列表.'''预计.

这确实编译:

var f = Foo<number>().factory(1);
Run Code Online (Sandbox Code Playgroud)

为什么需要括号?这是调用构造函数吗?

Fen*_*ton 20

正如静态方法无法访问实例成员一样,静态方法也不能使用实例类型参数.

因此,静态方法必须是通用的并接受类型参数.我通过U在静态函数和T类中使用来强调这一点.重要的是要记住实例类型T与静态方法类型不同U.

class Foo<T>
{
    public static factory<U>(item: U): Foo<U>
    {
        return new Foo<U>();
    }

    instanceMethod(input: T) : T
    {
        return input;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过在括号之前传递类型参数来调用它,如下所示:

var f: Foo<number> = Foo.factory<number>(1);
Run Code Online (Sandbox Code Playgroud)

当可以进行类型推断时,可以删除类型注释:

var f: Foo<number> = Foo.factory(1);
Run Code Online (Sandbox Code Playgroud)

变量fFoo类型参数为的实例number,因此该instanceMethod方法只接受type number(或any)的值.

f.instanceMethod(123);   // OK
f.instanceMethod('123'); // Compile error
Run Code Online (Sandbox Code Playgroud)