键入一组显式值类型的数组[重复]
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”中插入标识列的显式值 [重复]