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

如何强制对象嵌套键为指定类型?TypeScript类型约束实现

实现满足要求的Validate泛型类型

核心需求回顾

  • 泛型参数:第一个为嵌套属性名,第二个为强制类型
  • 递归校验对象所有层级的目标属性类型
  • 支持联合类型场景下的IDE自动补全
  • 避免目标属性必填、限制额外属性的问题

最终实现代码

type Validate<PropName extends string, TargetType> = 
  {
    [K in keyof any]: 
      K extends PropName ? TargetType | undefined : 
      Validate<PropName, TargetType>;
  } & 
  Record<string, unknown>;

实现关键点说明

  1. 递归嵌套校验:通过对属性值递归应用Validate,确保所有层级的目标属性都符合类型要求
  2. 目标属性可选:将目标属性类型设为TargetType | undefined,避免强制必填
  3. 支持额外属性:通过& Record<string, unknown>允许对象包含任意其他属性,不限制其类型
  4. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 05:01:34