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

TypeScript中如何扩展接口并限制仅使用原接口的键

TypeScript 限制扩展接口仅使用原接口已有键

TypeScript 默认的接口继承(extends)允许新增任意属性,要实现仅允许修改原接口已有键、禁止新增未知键的需求,需要通过交叉类型结合类型约束来实现,以下是两种实用方案:

方案一:直接交叉约束

通过将自定义类型与Record<keyof 原接口, never>交叉,强制任何原接口以外的键都会触发类型冲突报错:

interface First {
  key1: string;
  key2: string;
}

// 定义Second:仅能修改First已有的键
type Second = First & {
  key1: number; // 合法:修改已有键的类型
  // key3: string; // 非法:新增未知键,TS会报错:类型“string”不能赋值给类型“never”
};

方案二:封装通用工具类型(复用场景)

如果需要在多处使用这种约束,可以封装一个通用工具类型,提高代码复用性:

// 通用工具类型:仅允许扩展T的已有键,U必须是T的子集属性
type ExtendOnlyExisting<T, U extends Partial<Record<keyof T, unknown>>> = T & U;

interface First {
  key1: string;
  key2: string;
}

// 使用工具类型定义Second
type Second = ExtendOnlyExisting<First, {
  key1: number; // 合法
  // key3: string; // 非法:TS报错,提示U不满足约束
}>;

原理说明

  • TypeScript 的extends关键字设计为支持子类扩展新属性,这是面向对象继承的常规行为,因此无法直接通过extends实现限制。
  • 交叉类型结合Record<keyof T, never>的逻辑是:为所有原接口没有的键分配never类型,一旦尝试给这些键赋值,就会触发类型不兼容报错。
  • 通用工具类型通过U extends Partial<Record<keyof T, unknown>>直接约束U的键必须是T的子集,从根源上禁止新增未知键。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:56:01