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

如何编写TypeScript的FuzzyMatch类型实现对象键模糊匹配?

实现TypeScript的FuzzyMatch类型

我们需要实现FuzzyMatch<T, S>类型,要求当查询字符串S是对象T的任意键的子序列时返回true,否则返回false。针对给定示例,'ge'是'age'的子序列,因此FuzzyMatch<k, 'ge'>应返回true。

实现步骤

  1. 核心子序列匹配类型
    首先实现基础的IsSubsequence<Str, Sub>类型,用于判断Sub是否是Str的子序列:
// 判断Sub是否为Str的子序列
type IsSubsequence<Str extends string, Sub extends string> = 
  Sub extends '' ? true :
  Str extends `${infer First}${infer Rest}` ?
    Sub extends `${First}${infer SubRest}` ? IsSubsequence<Rest, SubRest> : IsSubsequence<Rest, Sub>
  : false;
  1. 封装FuzzyMatch类型
    基于IsSubsequence,遍历对象T的所有键,检查是否存在匹配的键:
type FuzzyMatch<T extends object, S extends string> = 
  S extends '' ? true :
  keyof T extends infer Keys ?
    Keys extends string ?
      IsSubsequence<Keys, S> extends true ? true : false
    : false
  : false;

测试示例

type k = {
  'name': number;
  'age': string;
};

type m = FuzzyMatch<k, 'ge'>; // 类型为true(匹配'age')
type n = FuzzyMatch<k, 'na'>; // 类型为true(匹配'name')
type p = FuzzyMatch<k, 'xyz'>; // 类型为false(无匹配键)

逻辑说明

  • IsSubsequence通过递归拆解字符串实现匹配:若子串为空则直接匹配成功;若目标字符串可拆分为首字符和剩余部分,优先尝试匹配子串的首字符,匹配成功则递归处理剩余部分,失败则跳过目标字符串的当前字符继续匹配。
  • FuzzyMatch通过keyof T获取对象的所有键,逐个检查是否存在满足子序列匹配的键,只要有一个匹配就返回true。

内容的提问来源于stack exchange,提问作者JackieWillen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:32:48