如何排除模板文字类型的子字符串?

2024-02-05

我想从模板文字类型(自 TypeScript 4.1 起可用)中排除一些子字符串,但我不知道是否可能。

Example:

我可以定义一个类型说“这个字符串是一个包含 2 个或更多元素的元组”,即类似的东西'[string, number]'使用这个文字类型:

type TupleWithTwoOrMoreElements = `[${string}, ${string}]`;

现在,我想做相反的事情,即创建一个文字类型说“这是一个类似元组的元素少于 2 个”通过排除子字符串, 。我想做这样的事情:

type TupleWithLessThanTwoElements = `[${someStringWithoutCommaOrSpace}]`;

我认为这样的写法是不可能的“正则表达式文字类型”,但我想知道是否有人能够解决这个问题。


(据我所知)不可能为“任何不带逗号的字符串”编写类型。但是,如果预先知道该字符串,则可以创建一个条件类型来检查该字符串是否包含逗号。

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

Typescript Playground 链接 https://tsplay.dev/WP5b5w

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何排除模板文字类型的子字符串? 的相关文章

随机推荐