You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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可直接替换

逻辑说明

  1. 将字符串拆分为首字符First和剩余部分Rest
  2. 校验首字符是否属于Char:
    • 若不属于,直接返回never
    • 若属于,递归校验剩余部分
  3. 递归到空字符串时(所有字符校验通过),返回原字符串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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 05:46:07