如何编写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] : [] );
类型逻辑拆解
- 空路径支持:
[]作为基础合法路径,对应整个对象本身的错误提示 - 数组类型处理:
- 允许单独的数字索引(比如针对数组
a的["a", 5]) - 允许在数字索引后追加数组元素类型的嵌套路径(比如
["a", 0, "c"])
- 允许单独的数字索引(比如针对数组
- 对象类型处理:
- 遍历对象的所有键,每个键可以作为路径的唯一元素(比如
["w"]) - 也可以在键后追加该键对应值类型的嵌套路径(比如
["x", "y"])
- 遍历对象的所有键,每个键可以作为路径的唯一元素(比如
- 基础类型边界:如果
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
相关产品推荐
相关产品推荐

