如何修复尝试调用泛型TypeScript方法时的编译错误



我不知道如何为这个问题命名,如果它不是描述性的,请原谅。但基本上,我所拥有的导致编译错误的代码与此类似:

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)
}
}

最新更新