类型定义:至少具有例如某种类型的数组。 2个元素

Type definition: An array of a certain type at least with e.g. 2 elements

也许这是个愚蠢的问题,但我想知道是否可以这样说,"foo" 必须至少有 2 个 "Foo" 类型的数组元素?

let foo: Array<Foo>; // how to say at least 2 Foos?

是的,您可以使用 rest element in a tuple type:

let foo: [Foo, Foo, ...Foo[]];

并且编译器会执行它:

declare const f: Foo;
foo = [f, f, f]; // okay
foo = [f, f]; // okay
foo = [f]; // error, property "1" is missing
foo = []; // error, properties "0" and "1" are missing

当然,编译器将无法轻易验证某些任意 Foo[] 与此匹配,即使您执行 "obvious" 长度检查:

declare const fooArray: Foo[];
foo = fooArray; // error, can't verify
if (fooArray.length >= 2) {
  foo = fooArray; // error, still can't verify
}

所以您可能会发现自己需要像 user-defined type guard function 这样的东西来将 Foo[] 转换为 [Foo, Foo, ...Foo[]]:

function isAtLeastTwoFoos(x: Foo[]): x is [Foo, Foo, ...Foo[]] {
  return x.length >= 2;
}

然后你就可以这样测试了。

if (isAtLeastTwoFoos(fooArray)) {
  foo = fooArray; // okay
}

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

Link to code

如果您不在代码中修改数组的长度,元组类型(如 中所示)是个好主意。

但是,您可以通过多种方式取消设置数组元素——shiftpopsplicefilter——这将导致你的数组不再符合您的期望。虽然这不一定不同于(比如说)不安全地将不相关的 Bar 元素放入 Array<Foo>,但您仍然可以仅使用运行时调用来破坏类型的安全性,这可能不是一个好主意.