TypeScript:将字符串文字类型强制为只有一个值

时间:2019-02-12 23:04:23

标签: typescript types

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

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

TL; DR;

问题是:是否有任何运算符可以强制某个枚举仅接受一个可能的值?诸如First<Country>Single<Country>之类的东西。

推理

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

我感兴趣的用例:Replace<T, K extends keyof T, NEW>用新类型T替换了NEW中的键。 K extends keyof T允许在T上使用多个键。我试图找出是否有可能限制到仅定义一个可能的值(即,如果传递了多个值,TS会抛出错误)。

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

2 个答案:

答案 0 :(得分:0)

您可以检查传递的类型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<...>时,它将在程序的某个位置生成类型错误。

答案 1 :(得分:0)

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

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