我们以以下字符串文字为例:
type Country = "RU" | "US" | "CN"
问题是:是否有任何运算符可以强制某个枚举仅接受一个可能的值?诸如First<Country>
或Single<Country>
之类的东西。
有Exclude
操作,它从另一组可能的值中减去一组特定的值。使用应用于一组值的Pick
,Omit
,Exclude
等,将返回一组新值,这将可能允许多个值。
我感兴趣的用例:Replace<T, K extends keyof T, NEW>
用新类型T
替换了NEW
中的键。 K extends keyof T
允许在T
上使用多个键。我试图找出是否有可能限制到仅定义一个可能的值(即,如果传递了多个值,TS会抛出错误)。
如果没有办法限制可能被证明的允许值集,那将仍然是一个有效的答案。
答案 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