2

所以从:

export interface Category{
  val: string;
  icon: string
}
const categoryArray: Category[] = [
  {
    val: 'business',
    icon: 'store'
  },
  {
    val: 'media',
    icon: 'video'
  },
  {
    val: 'people',
    icon: 'account'
  },

  ... 

我想像这样得到一个 Union 类型:

'business' | 'media' | 'people' ... 

我不知道有什么样的语法或助手,也许根本没有。我意识到这种方式可能是倒退的,也许应该使用枚举,但在此之前,我想知道它是可能的。

我想做的一些虚构的例子,但我希望解决方案更复杂

type Cats = keysof[] categoryArray 'val'  
type Cats = valuesof categoryArray 'val'

以下是关闭的,但返回string

export type CatsValType = typeof categories[number]['val']

或以下;而不是我需要字符串文字的类型

type ValueOf<T> = T[keyof T];
type KeyTypes = ValueOf<typeof categories[number]> // Returns: `string`

有类似的问题,例如:TypeScript 中是否有类似于 `keyof` 的`valueof`?但他们不假设一组对象。

和这里的例子:https://www.typescriptlang.org/docs/handbook/2/indexed-access-types.html是类似的,但我不想返回类型,而是字段的值,所以我得到了一个联合类型。

4

1 回答 1

2

如果满足以下条件,您可以这样做:

  • 数组中的值在运行时不会改变(因为类型信息是 TypeScript 的仅编译时的东西);和

  • 你告诉 TypeScript 它们的值不会通过使用as const;改变。和

  1. categoryArray常量 type Category[],因为如果您这样做,结果将只是string(因为Category["val"]'s type is string)而不是您想要的字符串文字联合类型。

这是一个示例(操场链接):

export interface Category{
  val: string;
  icon: string
}
const categoryArray = [
  {
    val: 'business',
    icon: 'store'
  },
  {
    val: 'media',
    icon: 'video'
  },
  {
    val: 'people',
    icon: 'account'
  },
] as const;

type TheValueUnion = (typeof categoryArray)[number]["val"];
//   ^? −− "business" | "media" | "people"

关键位是as constand type TheValueUnion = (typeof categoryArray)[number]["val"];,分解如下:

  1. typeof categoryArray获取的类型categoryArray(推断的类型,因为我们没有分配特定的类型)。
  2. [number]访问由 的类型上的数字索引的类型的联合categoryArray
  3. ["val"]从 #2访问联合上的val属性的类型联合,这是您想要的字符串文字类型:"business" | "media" | "people".
于 2022-01-13T14:01:01.070 回答