如何强制对象嵌套键为指定类型?TypeScript类型约束实现
实现满足要求的Validate泛型类型
核心需求回顾
- 泛型参数:第一个为嵌套属性名,第二个为强制类型
- 递归校验对象所有层级的目标属性类型
- 支持联合类型场景下的IDE自动补全
- 避免目标属性必填、限制额外属性的问题
最终实现代码
type Validate<PropName extends string, TargetType> = { [K in keyof any]: K extends PropName ? TargetType | undefined : Validate<PropName, TargetType>; } & Record<string, unknown>;
实现关键点说明
- 递归嵌套校验:通过对属性值递归应用
Validate,确保所有层级的目标属性都符合类型要求 - 目标属性可选:将目标属性类型设为
TargetType | undefined,避免强制必填 - 支持额外属性:通过
& Record<string, unknown>允许对象包含任意其他属性,不限制其类型 - IDE自动补全:使用
keyof any覆盖所有可能的属性名,配合联合类型时,IDE能正常提示目标属性
验证示例
基础嵌套校验
// 所有层级的value属性必须是boolean类型,允许其他任意属性 const validData: Validate<'value', boolean> = { value: true, title: '配置项', section: { value: false, desc: '子配置', detail: { // 若此处填入非boolean值,TypeScript会报错 value: true } } };
联合类型自动补全
// 联合类型场景,IDE会自动提示value或label属性 type ValidUnion = Validate<'value', boolean> | Validate<'label', string>; const unionItem: ValidUnion = { label: '用户名', value: false };
解决的现有问题
- 无需传入对象接口作为泛型参数,直接指定属性名和目标类型即可
- 目标属性为可选状态,不强制要求存在
- 完全允许对象包含目标属性以外的其他属性,不限制额外属性的类型
内容的提问来源于stack exchange,提问作者nox
相关产品推荐
相关产品推荐

