【问题标题】:Is there a way to use the string literal type in an interface of object?有没有办法在对象的接口中使用字符串文字类型?
【发布时间】:2021-03-05 15:23:03
【问题描述】:

我有一个类型Color

type Color = 'yellow' | 'red' | 'orange'

我有一个接口是ColorSetting的对象。

interface ColorSetting {
  id: string
  yellow?: boolean
  red?: boolean
  orange?: boolean
}

我想用Color这个类型来简化接口ColorSetting

我简化的代码如下:

interface ColorSetting {
  id: string
  [k in Color]?: boolean
}

但我收到关于A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type. 的错误

如何在接口中正确使用字符串字面量类型?

【问题讨论】:

  • 我得到了一个解决方案type ColorSetting = { id: string } & { [k in Color]?: boolean },这对我很有用。
  • 是的,交叉路口是一种方法。也许您应该将其发布为您自己问题的答案。

标签: typescript typescript-typings


【解决方案1】:

在那里使用字符串文字重要吗?带有字符串值的枚举是否不够:

enum Colors {
  YELLOW = 'yellow',
  RED = 'red',
  ORANGE = 'orange',
}

interface ColorSetting {
  id: string;
  color: Colors;
}

这种方法的唯一缺点是如果您需要反向映射这个,打字稿不会自己做。

我自己不倾向于使用这样的文字,所以我不确定这是否有效,但试一试:

interface ColorSetting {
  id: string;
  color: Color;
}

基本上只使用你声明的类型,去掉'[k in Color]'位

【讨论】:

    【解决方案2】:

    我找到了一个对我有用的解决方案。此解决方案使用Intersection Types

    ColorSetting = {
       id: string
     } & {
       [k in Color]?: boolean
     }
    

    【讨论】:

      猜你喜欢
      • 2022-06-18
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      相关资源
      最近更新 更多