具有在Typescript中编码为字符串的选项类型

具有在Typescript中编码为字符串的选项类型,typescript,Typescript,我不知道我到底在找什么,所以如果标题太笼统,我很抱歉 我在用JavaScript编写代码时开发了一种模式,当一个变量只能取n个可能值中的一个时,我会定义如下对象: const REQUEST_STATUS = { PENDING: "pending", SUCCESS: "success", FAILED: "failed" } enum REQUEST_STATUS { PENDING = "pending

我不知道我到底在找什么,所以如果标题太笼统,我很抱歉

我在用JavaScript编写代码时开发了一种模式,当一个变量只能取n个可能值中的一个时,我会定义如下对象:

const REQUEST_STATUS = {
  PENDING: "pending",
  SUCCESS: "success",
  FAILED: "failed"
}
enum REQUEST_STATUS {
  PENDING = "pending",
  SUCCESS = "success",
  FAILED = "failed"
}

type RequestStatus = REQUEST_STATUS.PENDING | REQUEST_STATUS.SUCCESS |REQUEST_STATUS.FAILED, 
之后在代码中,我将通过编写

const requestStatus = REQUEST_STATUS.PENDING
这样做的好处是,在我的IDE中,如果我将鼠标悬停在
REQUEST\u STATUS.PENDING
,我实际上可以看到该对象和该选项的其他可能值

我最近开始研究一个Typescript代码库,其中他们使用联合类型:

type RequestStatus = "pending" | "success" | "failed"
这有一个缺点,就是很多时候,逻辑是在没有类型注释的变量上执行的(是的,耶,是我),我的IDE将类型标记为
any
,所以我真的无处着手。我希望在使用这种类型的变量执行逻辑时避免硬编码字符串。有没有什么好方法可以在Typescript中以“Typescripty”的方式保留我的香草JavaScript技术的优点?基本上我需要两个特性:

  • 我可以对与n个可能值(通常是字符串)中的一个相关的类型进行编码
  • 我可以通过引用类型来引用一个或多个值,而不仅仅是字符串

    • 这样做怎么样:

      const REQUEST_STATUS = {
        PENDING: "pending",
        SUCCESS: "success",
        FAILED: "failed"
      }
      
      enum REQUEST_STATUS {
        PENDING = "pending",
        SUCCESS = "success",
        FAILED = "failed"
      }
      
      type RequestStatus = REQUEST_STATUS.PENDING | REQUEST_STATUS.SUCCESS |REQUEST_STATUS.FAILED, 
      

      但我认为,如果您需要全部,那么执行
      类型RequestStatus=REQUEST\u STATUS

      我决定以这种方式使用字符串枚举:

      /**
       * @enum REQUEST_STATUS
       * @property pending - Status used when the API call is on going
       * @property success - Status used when the API call is settled successfully
       * @property failed - Status used when the API call is settled unsuccessfully
       */
      enum REQUEST_STATUS {
        PENDING = "pending",
        SUCCESS = "success",
        FAILED = "failed"
      }
      

      由于枚举本身就是一种类型,因此我实际上不需要将枚举转换为联合类型;枚举在逻辑方面已经做得很好了。我所感兴趣的是,当在其他脚本中使用时,能够将鼠标悬停在我的枚举上,以查看它可以接受哪些值。JSDoc是我无论如何都想使用的东西,这样我也可以记录这些值。所以这听起来像是我要走的路。

      typescript有这个目的,我想这只是你缺少的术语。@chrisbajorin:我在发布我的问题后探索了一下,我想我想要的是沿着
      enum示例{option1,option2,option3}的思路
      后接
      type ExampleType=keyof typeof Example
      ,因为它使ExampleType成为联合类型
      “option1”|“option2”|“option3”
      。如果我接受此选项,我可能会回答自己的问题。如果使用字符串枚举,它将充当类型和联合值:
      as const
      是一个“const断言”。在对象上,它将属性转换为
      只读
      ,并将属性类型缩小为其文本值:例如
      种类。A
      变成
      “A”
      ,而不是
      字符串
      。从维护的角度来看,问题在于,您有一个值和一个类型,这两个值和类型只通过开发人员意识相关。如果有人输入错误,值
      Kind
      和类型
      Kind
      可能会漂移,而枚举总是同时占用类型和值空间。查看
      enum Kind
      向使用者表明他们需要导入该值/类型,该值/类型通常与使用it@chrisbajorin:我决定使用字符串枚举并使用JSDoc记录枚举所取的值。这有一个double-pro,我的值在某个地方被解释了,当我停留在enum上时,我看到了它们,因为JSDoc显示了不同的值。我有点不愿意使用
      keyof-typeof
      这种类型的方法,正是因为你提到的;在没有某种构造的情况下,很难始终保持类型及其值的一致性,我发现enum就是这种构造,我只需要找到一种方法使VSCode在hover上为我工作。谢谢,看起来这就是我要找的!我不知道枚举。我是否不必写出该类型的所有值?类似于“unionof”对象值(请求状态)。。。对于我的用例,枚举和简单对象之间有什么区别吗?因为如果我这样定义一个联合类型,一个好的旧对象也可以做同样的工作不?如果你这样做,就像创建一个联合,我不知道枚举是它们自己的类型,所以我肯定学到了一些东西!感谢chrisbajorin和Andri Nic的启发性讨论。通常在使用枚举时,也不需要指定它们是否为字符串,就像定义类似以下内容的
      enum REQUEST_STATUS{PENDING,SUCCESS,FAILED}
      @AndriNic:谢谢你让我知道:)指定字符串在某些情况下仍然很有用,所以枚举可以同时完成这两个任务!