键入一组显式值类型的数组[重复]

Posted

技术标签:

【中文标题】键入一组显式值类型的数组[重复]【英文标题】:Typing an array of an explicit set of value types [duplicate] 【发布时间】:2019-07-02 23:47:35 【问题描述】:

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

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

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

interface FieldSource 
  source: string;


interface SearchWhereClause 
  between: [FieldSource, number, number]

这编译得很好,但我不确定这是否正确。

我已经看到我可以做到:

(FieldSource | number | number)[]

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

有人可以建议吗?

谢谢

【问题讨论】:

【参考方案1】:

正如@hereticMonkey 在问题评论中提到的,这在很大程度上与Defining array with multiple types in TypeScript 重复

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

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

附注是我建议使用type FieldSource = source: string 而不是interface,除非你会在课堂上使用它。 与interface 相比,它是一个更强大、更直接、更灵活的构造。

【讨论】:

“我建议在接口上使用type FieldSource = source: string ”你应该包括你的理由【参考方案2】:

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

如果这确实是您想要的,那么您当前的方法是 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

这还允许 typescript 通过索引或解构轻松推断从数组中检索到的实体类型:

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]

【讨论】:

以上是关于键入一组显式值类型的数组[重复]的主要内容,如果未能解决你的问题,请参考以下文章

仅当使用列列表并且 IDENTITY_INSERT 为 ON [重复] 时,才能指定表“客户”中标识列的显式值

当 IDENTITY_INSERT 设置为 OFF 时,SQL 无法在表“表”中插入标识列的显式值 [重复]

当 IDENTITY_INSERT 设置为 OFF 时,无法在表“tbl Fingerprint”中插入标识列的显式值 [重复]

如何键入 Typescript 数组以仅接受一组特定的值?

键入具有多种键值类型的 Dict [重复]

如何从 C# 中的泛型类型数组中选择一组随机值?