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

TypeScript如何定义可给属性添加previous前缀的通用Previous类型

实现方案

核心实现(TS 4.1+)

该实现依赖TS 4.1版本新增的模板字面量类型和键重映射特性,代码如下:

// 实现给所有属性加previous前缀的泛型
type Previous<T> = {
  [K in keyof T as `previous${Capitalize<string & K>}`]: T[K]
};

// 组合原属性和加前缀的属性,得到最终的Change泛型
type Change<T> = T & Previous<T>;

示例验证

以你提到的Product接口做测试:

interface Product {
  name: string;
  price: number;
  stock: number;
}

type ProductChange = Change<Product>;

最终生成的ProductChange类型等价于以下结构,完全符合需求:

{
  name: string;
  price: number;
  stock: number;
  previousName: string;
  previousPrice: number;
  previousStock: number;
}

特殊场景调整

  • 如果你不需要前缀后属性名首字母大写(比如要生成previousname而非previousName),去掉Capitalize工具类型即可:
    type Previous<T> = {
      [K in keyof T as `previous${K}`]: T[K]
    };
    
  • 如果需要兼容数字、Symbol类型的属性键,可自行调整类型过滤逻辑,按需保留或忽略非字符串类型的键即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:03