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

如何编写ValidationPath<T>类型以限制TS对象的合法访问路径?

如何编写TypeScript类型ValidationPath以约束合法的验证路径

可以通过递归条件类型实现ValidationPath<T>,自动推导给定类型T的所有合法路径,包括空路径、单层属性、嵌套属性和数组索引。核心实现如下:

type ValidationPath<T> = [] | (
  T extends Array<infer U>
    ? [number, ...ValidationPath<U>] | [number]
    : T extends object
      ? { [K in keyof T]: [K, ...ValidationPath<T[K>] ] | [K] }[keyof T]
      : []
);

类型逻辑拆解

  1. 空路径支持:[]作为基础合法路径,对应整个对象本身的错误提示
  2. 数组类型处理:
    • 允许单独的数字索引(比如针对数组a的["a", 5])
    • 允许在数字索引后追加数组元素类型的嵌套路径(比如["a", 0, "c"])
  3. 对象类型处理:
    • 遍历对象的所有键,每个键可以作为路径的唯一元素(比如["w"])
    • 也可以在键后追加该键对应值类型的嵌套路径(比如["x", "y"])
  4. 基础类型边界:如果T是数字、字符串这类基础类型,仅允许空路径(因为基础类型没有子属性或索引)

结合示例验证

用你给出的测试类型:

type TestType = {
  a: { b: number, c: string }[],
  x?: { y: boolean, z: string | null },
  w: string
};

以下路径都会被ValidationPath<TestType>合法接受:

  • [] ✅
  • ["w"] ✅
  • ["a", 0] ✅
  • ["a", 0, "c"] ✅
  • ["x", "y"] ✅(可选属性自动被keyof包含,符合需求)
  • ["a", 5] ✅(数组索引无长度限制,和你的需求匹配)

注意事项

  • 可选属性无需额外处理,keyof会自动包含对象的可选键
  • 数组的数字索引不做范围校验,因为TypeScript类型系统无法感知运行时数组的实际长度,这和你允许["a", 5]的需求一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:10:17