我正在尝试扩展Array并创建Array2D类。我希望构造函数接受任意数量的参数,但是这些参数应该是T类型的数组。这是我到目前为止的内容:
class Array2D<T> extends Array<T[]> {
constructor(...args: T[][]) {
super(...args)
}
static of(...args: T[][]) {
return new Array2D(...args)
}
}
Typescript显示此错误:
Types of property 'of' are incompatible.
Type '<T>(...args: T[][]) => Array2D<T>' is not assignable to type '<T>(...items: T[]) => T[]'.
Types of parameters 'args' and 'items' are incompatible.
Type 'T' is not assignable to type 'T[]'.
有人可以解释Tyspecript抱怨什么以及如何解决这个问题。
答案 0 :(得分:2)
这是另一个输入解决方法。让我们将Array
构造函数的类型扩展为某种没有已知静态方法的东西:
const VanillaArrayConstructor: new <T>(...args: T[]) => Array<T>
= Array;
您可以使用VanillaArrayConstructor
来构造数组,但是如果您尝试调用.from()
或.of()
或任何其他静态方法,则编译器会抱怨。然后可以扩展 that 而不是Array
:
class Array2D<T> extends VanillaArrayConstructor<T[]> {
constructor(...args: T[][]) {
super(...args)
}
static of<T>(...args: T[][]) {
return new Array2D(...args)
}
}
这与Array2D
在运行时的实际行为没有什么区别,但是现在键入使得编译器不期望Array2D
构造函数的类型扩展{{ 1}}构造函数。
希望有帮助。祝你好运!