【问题标题】:Defining array of enum type in Typescript在 Typescript 中定义枚举类型的数组
【发布时间】:2021-06-14 01:55:17
【问题描述】:

我创建了一个 Typescript DTO,我想在其中确保字符串列表(从枚举类型派生)的类型安全。



export class ConnectedUserWithPhotosDTO extends UserWithPhotosDTO {
  userTags: keyof User["userTags"][]

  constructor(user: User, photos: ResponsePhotoDTO[]) {
    super(user, photos)
    console.log(user.userTags)
    this.userTags = user.userTags;
  }
}

打字稿编译器报错如下:

Type 'UserTags[]' is not assignable to type 'number | keyof UserTags[][]'.

显然,userTags 的值计算为

number | keyof UserTags[][]

这是我正在定义的枚举定义。

export enum UserTags {
  FITNESS = 'Fitness',
  FOURTWENTY_FRIENDLY = '420 Friendly',
  MEDITATION = 'Meditation',
  DRINKS = 'Drinks',
  DOGS = 'Dogs',
  CATS = 'Cats',
  FASHION = 'Fashion',
  WINE_TASTING = 'Wine Tasting',
  FOODIE = 'Foodie',
  ART = 'Art',
  PARTYING = 'Partying',
  TRAVELIING = 'Travelling',
  GAMING = 'Gaming',
}

在 User 类中,UserTags 定义为:

 @ApiProperty({ enum: UserTags, isArray: true, default: [] })
  @Column('enum', { enum: UserTags, array: true, nullable: true, default: [] })
  userTags: UserTags[]

我怎样才能为特定的 Enum 值定义 keyof 的类型?

【问题讨论】:

  • 提供User 类型。目前尚不清楚您要做什么。
  • 我 99% 确定您只想要字符串枚举并想要 userTags: UserTags[],但我会在答案中解释

标签: typescript


【解决方案1】:

由于您使用了keyof,您的帖子有点混乱。不清楚您是想要枚举 keys "FITNESS" 等还是枚举 values "Fitness"

根据User 的代码和您的错误消息很清楚,当您访问user.userTags得到的是。值的类型只是枚举本身,所以你会想要

userTags: UserTags[]

就像您在User 中所拥有的一样。这将与User 中的类型匹配是有道理的,因为我们正在基于User["userTags"] 设置userTags 属性。


让我们分解一下你尝试过的类型keyof User["userTags"][],看看它的真正含义。

User["userTags"] 为我们提供了 User 类型的 userTags 属性。我们可以从您的User 代码中看到User["userTags"]UserTags[]。这是来自UserTags 枚举的值的数组。比如["Fitness", "Fashion"]

User["userTags"][] 表示我们想要一个数组。但它已经是一个数组,所以您现在要求一个枚举值数组的数组:UserTags[][]。应该是[["Fitness"], ["Fashion", "Foodie"]]

keyof User["userTags"][] 表示我们现在需要该数组数组的键:keyof UserTags[][]。数组的键是number,所以打字稿会给你number | keyof UserTags[][]。 (我不知道为什么它不是只是 number)。


也许您正试图获取UserTags 枚举对象的密钥? keyof typeof UserTags 将为您提供联合类型 "FITNESS" | "FOURTWENTY_FRIENDLY" | "MEDITATION" ...。但这似乎并不是您真正想要使用的。您需要枚举值的联合,即 UserTags

【讨论】:

    【解决方案2】:

    你也可以这样做:

    const userTags: User['userTags'];

    【讨论】:

    • 编译器如何知道它是单个实例还是列表?
    • @Ating 它只是在User 类型中使用与userTags 属性完全相同的类型。
    【解决方案3】:

    假设 UserTags 是枚举。有点像

    userTags: Array<keyof typeof UserTags>
    

    【讨论】:

    • 问题是UserTags是用户类的嵌套属性
    • 请提供用户类定义
    • 你的答案就是他们要求的——枚举对象的键。但我不认为这是他们真正想要的。他们显然很困惑,但我认为他们想要枚举值Array&lt;UserTags&gt;
    猜你喜欢
    • 2022-09-23
    • 2020-07-18
    • 2021-01-24
    • 2018-10-18
    • 2012-03-10
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2011-09-11
    相关资源
    最近更新 更多