如何解决如何排除模板文字类型的子字符串?
我想从模板文字类型(自 TypeScript 4.1 起可用)中排除一些子字符串,但我不知道是否可行。
示例:
我可以定义一个类型,说“这个字符串是一个具有 2 个或更多元素的类似元组”,即类似 '[string,number]'
的具有这种文字类型的东西:
type TupleWithTwoOrMoreElements = `[${string},${string}]`;
现在,我想做相反的事情,即通过排除子字符串 ,
创建一个文字类型,说 “这是一个少于 2 个元素的类似元组”。我想做这样的事情:
type TupleWithLessThanTwoElements = `[${someStringWithoutCommaOrSpace}]`;
我认为不可能写出这种“regex-literal-type”,但我想知道是否有人能够解决这个问题。
解决方法
不可能(据我所知)为“没有逗号的任何字符串”编写类型。但是,如果事先知道该字符串,则可以创建一个条件类型来检查该字符串是否包含逗号。
type HasComma<S extends string,IfTrue = true,IfFalse = false> =
S extends `${string},${string}` ? IfTrue : IfFalse;
type A = HasComma<','> // true
type B = HasComma<'string'> // false
type C = HasComma<'[string,number]'> // true
所以给定一个文字字符串,我们可以验证它并确保它是一个只有一个元素的元组。
type ValidateOneTuple<S extends string,IfValid = S,IfInvalid = never> =
HasComma<S,IfInvalid,S extends `[${string}]` ? IfValid : IfInvalid>
type A = ValidateOneTuple<'[string,number]'> // never
type B = ValidateOneTuple<'[string]'> // "[string]"
type C = ValidateOneTuple<'[str,ing]'> // never
,
没有办法做到这一点。我有明确允许一些字符的想法,但这是不可能的,因为你不能说 char "x" of any length
。 Regex 类型也是不可能的,而且似乎不会很快实现。查看 GitHub 中的 this issue。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。