有没有办法通过数组中字段的值来定义类型?
为了简化我的问题... 假设我有一个静态数组:
const arr = [
{name: 'cat', language: 'meow'},
{name: 'dog', language: 'bark'},
{name: 'cow', language: 'moo'}
]
我希望能够创建一个函数,根据这样定义的名称字段获取语言
function getLanguage(name: X) {
我可以将类型 X
定义为什么,以便我可以将 X(该函数的参数)限制为该对象列表中的任何名称字段?
最佳答案
const arr = [
{name: 'cat', language: 'meow'},
{name: 'dog', language: 'bark'},
{name: 'cow', language: 'moo'}
] as const // pay attention here
type Name = (typeof arr)[number]['name']; // evaluates into 'cat' | 'dog' | 'cow'
function getLanguage(name: Name) { }
需要理解的几件事:
as const
以便告诉 TS 该类型应缩小为精确值(typeof arr)[number]
- 它给出数组元素类型,因为number
是数组映射类型的键(typeof arr)[number]['name']
- 它给出数组元素类型的name
字段的类型
如果你不需要缩小类型并且 string
满足你的名称字段那么简单地不附加 as const
,在结果 (typeof arr )[number]['name']
将被评估为 string
类型。
关于arrays - typescript :对象数组的valueof字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59989488/