给定一个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)
变量f
是Foo
类型参数为的实例number
,因此该instanceMethod
方法只接受type number
(或any
)的值.
f.instanceMethod(123); // OK
f.instanceMethod('123'); // Compile error
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13880 次 |
最近记录: |