类型定义:至少具有例如某种类型的数组。 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
}
希望对您有所帮助;祝你好运!
如果您不在代码中修改数组的长度,元组类型(如 中所示)是个好主意。
但是,您可以通过多种方式取消设置数组元素——shift
、pop
、splice
、filter
——这将导致你的数组不再符合您的期望。虽然这不一定不同于(比如说)不安全地将不相关的 Bar
元素放入 Array<Foo>
,但您仍然可以仅使用运行时调用来破坏类型的安全性,这可能不是一个好主意.
也许这是个愚蠢的问题,但我想知道是否可以这样说,"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
}
希望对您有所帮助;祝你好运!
如果您不在代码中修改数组的长度,元组类型(如
但是,您可以通过多种方式取消设置数组元素——shift
、pop
、splice
、filter
——这将导致你的数组不再符合您的期望。虽然这不一定不同于(比如说)不安全地将不相关的 Bar
元素放入 Array<Foo>
,但您仍然可以仅使用运行时调用来破坏类型的安全性,这可能不是一个好主意.