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

TypeScript如何定义支持嵌套属性路径的扁平化Matcher类型

支持点分隔嵌套属性路径的Matcher类型实现

核心实现分两步:先递归生成目标类型所有合法的点分隔嵌套路径联合类型,再将这些路径作为Matcher的合法键即可。

1. 定义嵌套路径生成工具类型

首先实现递归遍历类型结构、输出所有合法点分隔路径的工具类型,默认跳过数组原生属性避免生成无效路径:

type NestedKeyOf<T, Prefix extends string = ''> = {
  [K in keyof T & (string | number)]: T[K] extends object
    ? T[K] extends any[]
      ? `${Prefix}${K}` // 数组类型默认不向下递归,避免引入length/push等原生属性路径
      : `${Prefix}${K}` | NestedKeyOf<T[K], `${Prefix}${K}.`>
    : `${Prefix}${K}`;
}[keyof T & (string | number)];

2. 更新Matcher类型定义

基于生成的嵌套路径类型更新Matcher,同时补上原实现遗漏的bigint类型(适配IUser中id字段的BigInt类型),所有键设为可选:

export type Matcher<T> = {
  [K in NestedKeyOf<T>]?: number | string | boolean | bigint;
};

3. 使用效果验证

深层匹配场景可以正常通过类型校验,注意示例中的user.address.city是笔误——IUser结构下没有外层user字段,正确路径为address.city:

const deepMatcher: Matcher<IUser> = {
  id: 1n,
  "address.city": "San Francisco",
  "address.zipcode": 94107
};

如果输入不存在的路径(比如笔误的user.address.city),TypeScript会直接抛出类型错误,避免路径写错。

可选扩展

  • 如果需要支持数组下标路径(比如address.tags.0匹配数组第一个元素),把数组分支的逻辑改为递归数组元素类型即可:
    ? `${Prefix}${K}` | NestedKeyOf<T[K][number], `${Prefix}${K}.`>
    
  • 如果需要值类型和路径对应字段的类型严格匹配,而非统一使用基础类型联合,可以额外实现路径到对应值类型的映射工具类型做约束。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 06:31:27