typescript 从对象值数组接收类型

8xiog9wr  于 2022-12-01  发布在  TypeScript
关注(0)|答案(1)|浏览(156)

我想从对象数组中生成类型。

const names = [
  {
    name: 'Bob'
  },
  {
    name: 'Jane'
  },
  {
    name: 'John'
  },
  {
    name: 'Mike'
  },
]

结果应该如下所示:

type NameType = 'Bob' | 'Jane' | 'John' | 'Mike'

我看到了很多参考资料,比如这个typescript-types-from-arrays
但是这些例子总是使用字符串数组作为资源。比如:

const array = ['one', 'two',...]

它完美无瑕。
但我尝试用array.map生成类型,如下所示:

const allNames = names.map((item) => item.name) as const;

type NameType = typeof names[number];

但这导致了:

A 'const' assertions can only be applied to references to
enum members, or string, number, boolean, array, or object literals.

下面是一个我尝试做的可播放的例子:Stackblitz
我想要搭配IntelliSense使用getName()函式,以了解names数组中有哪些可用的名称。例如:

yhived7q

yhived7q1#

使用as constindexed access types的组合仍然可以实现这一点

const names = [
  {
    name: 'Bob'
  },
  {
    name: 'Jane'
  },
  {
    name: 'John'
  },
  {
    name: 'Mike'
  },
] as const

type NameType = typeof names[number]['name'];
// type NameType = "Bob" | "Jane" | "John" | "Mike"

TypeScriptPlayground

相关问题