如何实现TypeScript全字符匹配字符串类型?现有实现类似Trim不符需求
问题描述
我需要实现一个TypeScript类型,逻辑是逐个遍历字符串的每个字符:如果所有字符都匹配指定的Char集合,就返回原字符串;否则返回never或空字符串。但我当前写的代码行为类似Trim,不符合需求,求帮忙修正。
当前代码:
type Char = | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "E" | "f" | "F"; type Word<S extends string> = S extends `${Char}${infer Rest}` ? Word<Rest> : never;
解决方案
要实现逐个校验所有字符都属于Char集合,核心是递归校验每一位字符,同时保留原字符串的返回逻辑,而非像原代码那样递归到最后返回never。以下是两种可行实现:
实现一:返回原字符串或never
所有字符匹配时返回原字符串,任意字符不匹配则返回never:
type Char = | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "E" | "f" | "F"; type Word<S extends string> = S extends `${infer First}${infer Rest}` ? First extends Char ? Word<Rest> extends never ? never : S : never : S; // 空字符串场景返回空,需改为never可直接替换
逻辑说明
- 将字符串拆分为首字符
First和剩余部分Rest - 校验首字符是否属于
Char:- 若不属于,直接返回
never - 若属于,递归校验剩余部分
- 若不属于,直接返回
- 递归到空字符串时(所有字符校验通过),返回原字符串
S;只要有一位不匹配,整个类型返回never
实现二:返回原字符串或空字符串
如果需要不匹配时返回空字符串而非never,可调整为:
type Char = | "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" | "a" | "A" | "b" | "B" | "c" | "C" | "d" | "D" | "e" | "E" | "f" | "F"; type Word<S extends string> = S extends `${infer First}${infer Rest}` ? First extends Char ? Word<Rest> extends "" ? "" : S : "" : S;
测试示例
用以下代码验证效果:
// 符合条件,返回原字符串 type Valid1 = Word<"a1F">; // "a1F" type Valid2 = Word<"">; // ""(按需可改为never) // 不符合条件,返回never或"" type Invalid1 = Word<"g12">; // never(或"") type Invalid2 = Word<"12z">; // never(或"")
内容的提问来源于stack exchange,提问作者Wagie
相关产品推荐
相关产品推荐

