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

TypeScript 单个对象类型中同时使用多个keyof约束的实现方案

解决方案

核心思路

TypeScript 不支持在单个对象类型内定义多个映射类型,因此使用交叉类型(&)合并多组约束,搭配泛型前置校验即可满足所有要求。

完整实现

// 工具类型:展开交叉类型,提升类型提示可读性,避免TS隐式合并类型导致的校验失效
type Prettify<T> = { [K in keyof T]: T[K] } & {}

// 泛型前置约束:PS必须是P的子集,直接满足第三个约束
function createTest<P extends object, PS extends Partial<P>>(
  parseProps: Prettify<
    // 约束1:PS的所有键必须存在,且类型和PS定义匹配
    Required<PS>
    // 约束2+额外键校验:P中不属于PS的键标记为never,不允许赋值;不在P范围内的键会触发TS多余属性校验直接报错
    & Record<Exclude<keyof P, keyof PS>, never>
  >
) {
  // 函数实现逻辑
  return { parseProps }
}

// 测试用例
const test = createTest<{type1: any, type2: any}, {type1: string}>({
  type1: 'test', // 正常:PS要求的必填键
  // type2: 123, // 报错:不能将类型number分配给类型never
  // type3: true // 报错:对象字面量只能指定已知属性,type3不存在于目标类型
})

语法报错原因说明

之前尝试在单个对象类型中写两个[key in ...]映射类型触发语法错误,是TypeScript的固定语法限制:单个对象类型定义中仅允许存在一个映射类型声明,使用交叉类型合并多个映射类型是该场景的标准解决方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:45:07