【发布时间】:2019-10-17 07:45:08
【问题描述】:
我正在尝试扩展 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 抱怨什么以及如何解决这个问题。
【问题讨论】:
-
我的猜测是子类化对于构造函数来说是故意的,但其他静态函数是严格的。所以
Array2D.of()最好接受与Array.of()相同的参数,但事实并非如此。所以你得到一个错误。解决方法很多,但大概最简单的方法是将of的名称更改为Array2D.make()或不冲突的东西。 -
@jcalz 除非我弄错了,否则问题在于 Array2D.of() 仍然存在,但不会强制正确输入,它将允许创建一维数组。跨度>
-
一个简单的解决方法是放弃继承数组,只创建一个新类。过去尝试过类似的事情,我总是得出这样的结论,即使涉及一些额外的工作,它也容易得多,另外让您高枕无忧,您的代码可以按预期工作。对于您的特定示例,
[...new Array2D([1,2,3])]会给您一个number[][],我想这不是您想要的。可能还有其他类似的怪癖,让你自己的课程可以让你避免。 -
@BijouTrouvaille 实际上这正是我想要的行为。我真正想扩展 Array 的原因是因为我希望能够使用
myVar[y][x]语法来访问数组中的项目,而不必实现方法来这样做。但如果我找不到解决方法,我想这就是我必须要做的。 -
@neoflash 你考虑过iterables吗?
标签: arrays typescript inheritance multidimensional-array types