【问题标题】:TypeScript: enforce string literal type to have only one valueTypeScript:强制字符串文字类型只有一个值
【发布时间】:2019-07-06 16:26:33
【问题描述】:

我们以下面的字符串文字为例:

type Country = "RU" | "US" | "CN"

TL;DR;

问题是:是否有任何运算符可以强制某个枚举只接受一个可能的值? 类似First<Country>Single<Country>

推理

Exclude 操作从另一组可能值中减去一组特定值。使用PickOmitExclude 等应用于一组值,将返回一组新值,这将允许潜在的多个值。

我感兴趣的用例:Replace<T, K extends keyof T, NEW>,它将T 中的键替换为新类型NEWK extends keyof T 允许在 T 上使用多个键。我正在尝试查找是否可以限制为仅定义一个可能的值(即,如果通过了多个值,TS 会抛出错误)。

如果没有办法限制允许值的集合,可能已经证明,那仍然是一个有效的答案。

【问题讨论】:

  • 你写“这个枚举”是什么意思?
  • 您能否编写一些代码来显示您希望允许哪些情况以及您希望禁止哪些情况?
  • 感谢大家的兴趣。我改进了我的问题。

标签: typescript types


【解决方案1】:

您可以尝试使用实际的枚举而不是字符串联合。它可能看起来像这样:

export enum Country {
  RU = 'Russia',
  US = 'United States',
  NZ = 'New Zealand',
}

那么这只是断言您的值是其中一种类型的问题。例如:Country.NZ.

注意:类型"New Zealand" 不能分配给类型Country.NZ,因为它是一个字符串。要检查字符串是否匹配,您可以使用反向映射。

在此处查看有关枚举和反向映射的文档 -> https://www.typescriptlang.org/docs/handbook/enums.html#reverse-mappings

【讨论】:

    【解决方案2】:

    您可以检查是否传递了类型is a union

    type Single<T> = IsUnion<T> extends true ? Error<'Must not be a union'>  : T
    
    interface Error<M> {msg: M}
    
    type x = Single<'foo' | 'bar'> // Error<'Must not be a union'>
    type y = Single<'foo'> // foo
    

    Error 类型只能用于类型检查,不必在运行时实现。假设它会在程序的某处产生类型错误,当预期string 但收到Error&lt;...&gt; 时。

    【讨论】:

    • isUnion 回答类型是否为联合。但是,我正在寻找一种将联合范围缩小为单个允许值的方法。可能是“FirstInUnion”或LastInUnion
    • @ducin Unions 不保证其成员的任何顺序。如果你需要这个,你做错了
    • 你说得对,我不需要订单。但我确实需要强制工会只有一个项目。我需要对对象类型执行操作 - 我需要用新传递的类型替换字段的原始类型。但我希望能够强制它只定义一个字段。不是整个范围的字段(这是默认值),因为它太容易出错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 2021-10-18
    • 1970-01-01
    • 2011-10-06
    • 2017-11-13
    • 2013-05-30
    相关资源
    最近更新 更多