如何为属性相互依赖的对象数组声明TypeScript类型?
解决方案
我们可以通过泛型辅助函数结合类型自动推断实现需求,无需提前枚举所有可能的类型,可适配任意类型的one属性:
- 首先定义基础的
Value类型:
type Value<T> = { one: T, all: T[] }
- 定义校验数组的工具类型和创建
root对象的辅助函数:
// 校验数组每一项都符合 Value 类型约束 type ValidateValues<T extends unknown[]> = { [K in keyof T]: T[K] extends Value<infer U> ? Value<U> : never } // 辅助函数:自动推断并约束 values 数组内的元素类型 function createRoot<T extends unknown[]>(root: { values: ValidateValues<T> }) { return root }
- 直接使用辅助函数定义
root对象即可触发类型校验:
const root = createRoot({ values: [ { one: 1, all: 5 }, // 类型错误:all 应为 number[] 类型 { one: true, all: [5] }, // 类型错误:all 应为 boolean[] 类型 { one: 'a', all: ['a', 'b', 'c'] }, // 校验通过 { one: true, all: [false, true, true] } // 校验通过 ] })
实现原理
辅助函数会自动推导values数组中每个元素的one属性类型,再强制约束同元素的all属性必须为该类型的数组,完全满足任意类型适配的要求。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

