打字稿:对象数组的字段值

Gls*_*nna 5 arrays types typescript

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

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

const arr = [
  {name: 'cat', language: 'meow'},
  {name: 'dog', language: 'bark'},
  {name: 'cow', language: 'moo'}
]
Run Code Online (Sandbox Code Playgroud)

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

function getLanguage(name: X) {
Run Code Online (Sandbox Code Playgroud)

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

Mac*_*ora 8

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) { }
Run Code Online (Sandbox Code Playgroud)

有几点需要理解:

  • as const为了告诉 TS 类型应该缩小到精确值
  • (typeof arr)[number]- 它给出数组元素类型,就像number数组映射类型的键一样
  • (typeof arr)[number]['name']- 它给出name数组元素类型的字段类型

如果您不需要缩小类型并string满足名称字段的要求,那么只需不追加as const,结果(typeof arr)[number]['name']将被评估为string类型。