arrays - typescript :对象数组的valueof字段

标签 arrays typescript types

有没有办法通过数组中字段的值来定义类型?

为了简化我的问题... 假设我有一个静态数组:

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/

相关文章:

vim - Vim 的快速修复列表的 errorformat 中的错误类型是什么?

javascript - 如何根据 JavaScript 中的键名称比较两个 JSON 值?

java - 某些组件的用途

c - 在文件作用域中使用C初始化数组大小

arrays - scala 中的多维数组 zip 数组

jquery - TypeScript 无法加载/使用 table2excel

typescript - 避免对联合类型进行愚蠢的推断(元素隐式具有 'any' 类型,因为类型的表达式...)

javascript - 在 javascript/typescript/nodejs 中创建可能的组合

types - 为什么 A = Tuple{4, 5} 是有效的 Julia 语法?这是什么意思?

c++ - 更改函数的输入类型