我不知道如何为这个问题命名,如果它不是描述性的,请原谅。但基本上,我所拥有的导致编译错误的代码与此类似:
class Box<T> {
}
class Gen<T extends Box<number>> {
private action(array: Array<T>): Array<T> {
return new Array()
}
private useAction() {
let x:Box<number>[] = new Array<Box<number>>();
// This leads to the compilation error
this.action(x)
}
}
我希望这能奏效。
我将action
定义为采用任何类型的数组,因此array:Array<T>
在useAction
中,我正在调用action
方法。
我用Box<number>
数组来称呼它
由于我将其定义为采用任何类型,因此我希望将类型为Box<number>
的变量传递给action
就可以了。
但它因编译错误而失败:
类型为"Box[]"的参数不可分配给的参数类型"T[]"。类型"Box"不可分配给类型"T"。"Box"可分配给类型为"T"的约束,但"T"可以用不同的约束子类型实例化"方框"。
我无法破译错误消息。为什么它会失败,我该如何修复它?
typescript中有两种类型的泛型。可以在类或函数上使用泛型。
当您有一个泛型类(Gen<T>
(时,整个类都是泛型的,并且它的所有非静态方法都可以使用泛型类型参数(T
(。但它的方法不是通用的,它们将像任何常规方法一样。
这是因为当您从类(const gen = new Gen<SomeClass>();
(创建一个对象并对其调用方法(gen.action(something)
(时,类型参数(T
(已经是完全已知的(SomeClass
(。
我认为你想要的不是一个泛型类,而是在你的类上有一个泛型方法:
class Box<T> {
}
class Gen {
private action<T extends Box<number>>(array: Array<T>): Array<T> {
return new Array()
}
private useAction() {
let x:Box<number>[] = new Array<Box<number>>();
// This leads to the compilation error
this.action(x)
}
}
通过这种方式,您将创建一个不带类型参数的类对象(const gen = new Gen();
(,但可以对任何扩展Box<number>
的类型的数组调用action
方法。
你也可以让你的类和方法都是泛型的(我不认为这是你想要的,但为了完整性,我会添加一个例子(:
class Box<T> {
}
class Gen<T extends Box<number>> {
private action<U extends Box<number>>(array: Array<U>): Array<U> {
return new Array()
}
private useAction() {
let x:Box<number>[] = new Array<Box<number>>();
// This leads to the compilation error
this.action(x)
}
}