【问题标题】:Overriding Array.of() in Typescript for a custom 2D array class that extends Array在 Typescript 中为扩展 Array 的自定义二维数组类覆盖 Array.of()
【发布时间】: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


【解决方案1】:

这是另一种打字解决方法。让我们将 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 构造函数的类型扩展Array 构造函数的类型。

希望对您有所帮助。祝你好运!

Link to code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 2021-10-17
    • 2021-01-16
    • 2018-05-18
    • 2020-12-29
    相关资源
    最近更新 更多