键入一组明确的值类型的数组

时间:2019-02-08 17:22:17

标签: typescript

我试图弄清楚如何在TypeScript中为以下值定义类型:

[{"source": "bar"}, 1483228800, 1484265600]

到目前为止,我想出的唯一方法是:

interface FieldSource {
  source: string;
}

interface SearchWhereClause {
  between: [FieldSource, number, number]
}

这可以编译,但是我不确定这是否正确。

我已经知道我能做到:

(FieldSource | number | number)[]

但是在我的情况下,我明确希望数组包含我的对象和两个数字值。

有人可以建议吗?

谢谢

2 个答案:

答案 0 :(得分:1)

正如问题评论中提到的@hereticMonkey一样,这基本上是Defining array with multiple types in TypeScript的副本

专门针对您的问题,因为您正在寻找显式集合。元组就是答案。

(FieldSource | number | number)[]Array<FieldSource | number | number>相同,这意味着它是一个任意长的数组,可以将这些类型作为任意顺序的项。

一个旁注是,除非您在课堂上使用它,否则我建议使用type FieldSource = { source: string }而不是interface。 与interface相比,它是一种更强大,更直接,更灵活的构造。

答案 1 :(得分:0)

  

但是在我的情况下,我明确希望数组包含我的对象和两个数字值

如果这确实是您想要的,那么您当前的方法是100%正确的,请注意,该数组中的类型必须按该顺序出现。

(FieldSource | number )[][FieldSource, number, number]有很大的不同),请考虑以下因素:

interface MyInterface {
  prop: number
}

type MyTuple = [MyInterface, number, number]
type MyArr = (MyInterface | number)[]

const myTup: MyTuple = [{ prop: 2 }, 2, 2] // <-- can only have two numbers
const myArr: MyArr = [{ prop: 2 }, 2, 2, 2, 2] // <-- can have any amount of numbers
const myArrAsTup: MyTuple = [{ prop: 2 }, 2, 2, 2, 2] // <-- not assignable to type

(FieldSource | number )[](FieldSource | number | number)[]相同,是说该数组可以包含任意顺序和任意数量的值。

[FieldSource, number, number]被称为Tuple type,它使您既可以强制执行数组中允许的类型,也可以强制执行这些类型的位置以及数组的长度。

type MyTuple = [MyInterface, number, number]

const tupleOne: MyTuple = [2, 2, {prop: 2} ] // <-- not assignable
const tupleTwo: MyTuple = [2, {prop: 2}, 2] // <-- not assignable

这也使打字稿可以通过索引或解构轻松推断从数组中检索到的实体的类型:

const [interfaceInstance] = myTup // <-- type is MyInterface
const aNumber = myTup[1] // <-- type is number

如果您不能确定类型顺序(或不想),则可以始终对多个元组使用联合:

// less verbose, worse inference
type TupleMember = (MyInterface | number)
type MyTuple = [TupleMember, TupleMember, TupleMember]

// more verbose, can still infer types of tuple members
// as long as those tuples are created somewhere in your codebase
// and not the result of something else, like an API call
type MyTuple = 
  [MyInterface, number, number] |
  [number, MyInterface, number] |
  [number, number, MyInterface]