TypeScript:如何为具有不同元素类型但不是固定长度的 JavaScript 数组声明类型?

rak*_*ice 6 typescript

假设我将有一个 JavaScript 数组,该数组在开始时具有不同元素类型的特定模式,但在最后有一个(模式)重复项类型,重复任意次数。

如何声明与此 JavaScript 数组兼容的 TypeScript 类型?

interface A {
  foo: Foo,
  bar: Bar,
}

interface B {
  baz: Baz
}

interface Bat {
  // getArr(): [A, B, B, B],  // tuple type puts types at specific indexes 
                              // but only supports a fixed number of elements
  // getArr(): Array<A | B>,  // array type notation allows arbitrary number 
                              // of elements but doesn't require them to be
                              // in specific positions
}
Run Code Online (Sandbox Code Playgroud)

编辑:

为了进一步澄清,我正在尝试使用带有普通 JavaScript 代码的外部 TypeScript 声明来识别现有 JavaScript 代码中的问题。我理解这种表述可能是不明智的;如果在创建原始 JavaScript 代码时运用了更多智慧,我就不会开始这次冒险。

use*_*740 2

在 TypeScript 的类型系统中不可能这样声明:数组必须具有同质类型1

在这种情况下,数组 ( Array<c'>) 是同质的c',其中c' = A | B.


当然,如果数据结构可以分解,那么一些附加/复杂的编码可能是“合适的”,例如。

[ A, Array<B> ]
Run Code Online (Sandbox Code Playgroud)

1我不知道有任何编程语言类型系统允许基于任意模式规则对未绑定序列进行此类限制。

  • 这也不是数组、列表等的用途。如果有不同类型的元素,您可能应该使用一个对象,为不同的集合命名。 (2认同)