我需要一个本质上是“除 {reservedKeywords} 之外的任何字符串”的类型。然而,这显然是要么不可能,要么棘手且笨拙 https://stackoverflow.com/a/63549561/1730082.
我可以满足于必须指定要使用的字符串文字。
这是我能得到的最接近我想要的,使用Exclude<T,K>
:
type AnySet<set extends string> = set
let test1: Exclude<AnySet<"a" | "1">, "1">
test1 = "a" //passes correctly
test1 = "1" //fails correctly
let test2: Exclude<AnySet<string>, "1">
test2 = "a" //passes correctly
test2 = "1" //passes (counterintuitively :( )
有什么办法可以禁止通过string
直接地?
此外,有没有一种方法可以将类型定义为任何字符串文字的集合,但不是特定的string
?
这就是我的意思:
type AnySet<set extends string> = set
let test1: Exclude<AnySet<"a" | "1">, "1">
test1 = "a" //passes correctly
test1 = "1" //fails correctly
let test2: Exclude<AnySet<string>, "1">
test2 = "a" //passes correctly
test2 = "1" //passes (counterintuitively)
type FiniteSet<set extends ???> = set
let test3: Exclude<FiniteSet<"a" | "1">, "1">
test3 = "a" //should work
test3 = "1" //should not work
let test4: FiniteSet<string> //should fail
let test5: FiniteSet<"a" | "b" | "c"> //should work
您可以使用递归约束(所谓的F 界定量 https://en.wikipedia.org/wiki/Bounded_quantification#F-bounded_quantification) like S extends Exclude<string, S>
:
type FiniteSet<S extends Exclude<string, S>> = S
let test3: Exclude<FiniteSet<"a" | "1">, "1">
test3 = "a" // okay
test3 = "1" // error
let test4: FiniteSet<string> // error
let test5: FiniteSet<"a" | "b" | "c"> // okay
这有效是因为the Exclude<T, U>实用型 https://www.typescriptlang.org/docs/handbook/utility-types.html#excludetype-excludedunion过滤联合体T
删除任何可分配给U
. If T
is string
那么输出将是string
(if string
不是 的子类型U
) or never
(if string
是一个子类型U
)。细绳文字类型 https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types是以下子类型string
但反之则不然,这给出了您正在寻找的行为。
Playground 代码链接 https://www.typescriptlang.org/play?#code/C4TwDgpgBAggdiAyhYAeRUIA9gTgEwGcpDgAnASzgHMA+KAXikQFgAoAGxSl1IEYAXFACiWAMYcArvgip4SFKgBEAQyVQAPlCV8ltADTbdtdr2B9G2tVAD0NsCsKEIxMQHsyZCGOAcQpl3NLHXU7ADMVCg5XDy8fP3Z2LmAeQIAmIVEJaVl5ZDRSShoDIz0A0jTg6zsHJxcod09vX382M0qmENt7R2diAAp3SThcIuBJCmAKADcIPwBKRLbwaAAxKkmIfPRMHDwiEXEpGVRCqmpDRFp6JlZObjMAZkyjnNR1uE3t1XUtEJL-uVgI8qqEbIQABZuSQcfBQADuHgA1kCQZ1dN1IdDYVA4G4UoiyCi2EkHoEACxCD5fRRnYqYqEwuERKKklJmACsVI2uG+1j+ACNftoxHoGdi4YSkUA
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)