【问题标题】:TypeScript property with allowed values taken from an array at runtimeTypeScript 属性,允许在运行时从数组中获取值
【发布时间】:2021-10-17 17:33:05
【问题描述】:

我正在努力解决的问题是如何在 TypeScript 中为属性指定允许的值。

我有这个接口,该接口具有静态类型的上述属性:

interface SomeInterface{
    prop: "bell" | "edit" | "log-out"
}

但我需要这样的东西:

const list = ["bell", "edit", "log-out"]

interface SomeInterface{
    prop: list(allowed are all values from list)
}

这里的允许值列表是动态变化的。

仅供参考,这是我第一次询问 stackoverflow。谢谢!

【问题讨论】:

  • 据我所知这是做不到的,因为数组的值可以在运行时更改为任何值,所以在编译时间其中的值是什么。含义:不能将值信息与类型信息混在一起。

标签: typescript


【解决方案1】:

您可以通过此answerofficial documentation 了解有关const 的更多信息。

const list = ["bell", "edit", "log-out"] as const;
interface SomeInterface{
    prop: (typeof list)[number] // the type would be union of array values
   //  here it would "bell" | "edit" | "log-out"
}

【讨论】:

    【解决方案2】:

    你需要enum这里

    枚举是预定义的值,您可以为值指定它们并且它们是严格的,并且当您在枚举中放置的值超过定义的项目时,打字稿会给您一个错误。

    在您的情况下,您可以执行以下操作:

    enum MY_ACTION_LIST {
      BELL = 'bell',
      EDIT = 'edit',
      LOG_OUT = 'log-out'
    }
    
    interface SomeInterface {
      props: MY_ACTION_LIST
    }
    

    通过这样做,您将确保除了您在枚举中指定的项目之外,道具不能是其他任何东西。

    更多信息here.

    【讨论】:

    • 这不只是提问者试图避免的一种不同的实现方式吗?
    • 我建议至少以更清洁的方式实现它。通过这样做,其他开发人员总是会认为有一个动作列表,他们正在工作的任何模块的动作都仅限于枚举中的值。我认为这是更清洁、更简单的实现方式
    猜你喜欢
    • 2021-10-14
    • 1970-01-01
    • 2017-07-23
    • 2012-05-13
    • 2019-07-11
    • 2020-11-07
    • 2018-08-06
    • 2011-08-05
    相关资源
    最近更新 更多