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

如何创建仅含指定Type键且可修改值类型的TypeScript类型

实现严格匹配原类型键的TypeScript类型定义

先看需求场景的代码:

type Numbers = {
  a: number;
  b: number;
  f: number;
};

// 期望的类型:
// - 不能新增原类型没有的键(比如c会报错)
// - 必须包含原类型所有键(缺失f会报错)
// - 每个键的类型可以自定义修改
type SameKeysWithNewTypes = /* 待实现的类型 */;

要实现这个严格约束的类型,可以自定义一个StrictReplace类型,核心通过三层约束满足需求:

type Numbers = {
  a: number;
  b: number;
  f: number;
};

// 严格替换类型:强制匹配原类型的所有键,禁止新增额外键
type StrictReplace<Original, Replace extends Partial<Record<keyof Original, unknown>>> = 
  // 强制必须包含原类型的所有键,缺失则对应键类型触发报错
  { [K in keyof Original]-?: Replace[K] } & 
  // 禁止新增原类型没有的键,额外键类型设为never触发报错
  Record<Exclude<keyof Replace, keyof Original>, never>;

// 正确使用示例:覆盖所有键,无额外键
type SameKeysWithNewTypes = StrictReplace<Numbers, {
  a: string;
  b: Date;
  f: boolean;
}>;

// 错误示例1:新增不存在的键c
// type BadType1 = StrictReplace<Numbers, {
//   a: string;
//   b: Date;
//   f: boolean;
//   c: null; // 报错:类型null不能赋值给never
// }>;

// 错误示例2:缺失原类型的键f
// type BadType2 = StrictReplace<Numbers, {
//   a: string;
//   b: Date;
//   // 缺失f,此时f的类型为never,后续赋值会报错
// }>;

约束逻辑说明

  • Replace extends Partial<Record<keyof Original, unknown>>:先限制替换对象的键只能是原类型键的子集,初步过滤额外键。
  • { [K in keyof Original]-?: Replace[K] }:通过映射类型强制生成原类型的所有键,-?移除可选性,如果替换对象中缺失某个键,该键的类型会因未定义触发类型不兼容报错。
  • Record<Exclude<keyof Replace, keyof Original>, never>:把替换对象中所有原类型没有的键映射为never,当用户给这些键设置其他类型时,会因类型不兼容直接报错。

这样就能完全满足:键必须完全来自原类型、必须包含所有原键、每个键类型可自定义修改的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:32