【问题标题】:TypeScript type string of specific characters特定字符的 TypeScript 类型字符串
【发布时间】:2019-06-23 09:56:06
【问题描述】:

假设我想允许一个十六进制字符串;所以唯一允许的值是 0-9a-f。 TypeScript 中有没有办法定义一个只接受某些字符串的类型字符串?即

// valid
const valid: HexString = '123abc';
// invalid
const invalid: HexString = 'ijk';

我知道 Regex 类型定义是一个提案 here,同时想知道是否有办法实现这一点。

【问题讨论】:

    标签: javascript typescript


    【解决方案1】:

    只有使用“OpaqueTypes”或“Nominal Types”,只要你有一个可以使字符串成为HexCode的实现,实现如下。

    export type Opaque<K, T> = T & { __TYPE__: K };
    type HexCode = Opaque<string, "HexCode">
    
    const createHexCode = (str: string): HexCode => {
      // implementation that forces string to be hexCode
      return str.toString() as HexCode // casting is needed.
    }
    const test = createHexCode("#333");
    const isAssignableString: string = test; // yes anything that is HexCode is still technically a string.
    const isAssignableHexCode: HexCode = "standard string" // error
    

    这种模式对于 PositiveInteger 和 PasswordHash 之类的东西也很有用,您不希望任何人不小心将纯字符串分配给您想要强制人们使用返回 PasswordHash 的函数的值

    【讨论】:

    • 如果传入的字符串与正则表达式不匹配,您可能希望createHexCode() 的实现抛出运行时错误。或者 createHexCode() 返回一个 HexCode | undefined。甚至是isHexCode(str: string): str is HexCode 类型保护。
    • 是的@jcalz 肯定其中任何一个都很重要,我想我会把它留给他,绝对取决于用例,因为即使只是返回默认值也可以在很多用例中工作( IE 游戏如何使缺失的纹理默认为紫色或突出的颜色,以便他们可以看到缺失而不是扔掉)
    • type HexCode = Opaque&lt;string, "HexCode"&gt;?你的意思是type HexCode = Opaque&lt;"HexCode", string&gt; 吗?
    猜你喜欢
    • 2016-08-31
    • 2017-03-31
    • 2017-07-29
    • 2017-03-29
    • 2017-11-13
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 2017-08-24
    相关资源
    最近更新 更多