【问题标题】:Typescript: valueof field of an array of objects打字稿:对象数组的值字段
【发布时间】:2020-05-16 06:33:17
【问题描述】:

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

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

const arr = [
  {name: 'cat', language: 'meow'},
  {name: 'dog', language: 'bark'},
  {name: 'cow', language: 'moo'}
]

我希望能够创建一个函数,根据这样定义的名称字段获取语言

function getLanguage(name: X) {

我可以将类型 X 定义为什么,以便我可以将 X(该函数的参数)限制为该对象列表中的任何名称字段?

【问题讨论】:

标签: arrays typescript types


【解决方案1】:
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 类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-03
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2020-06-22
    • 2018-06-26
    • 1970-01-01
    • 2020-05-02
    相关资源
    最近更新 更多