为扩展Array的自定义2D数组类重写Typescript中的Array.of()

时间:2019-05-31 16:35:44

标签: arrays typescript inheritance multidimensional-array types

我正在尝试扩展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抱怨什么以及如何解决这个问题。

1 个答案:

答案 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}}构造函数。

希望有帮助。祝你好运!

Link to code