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

如何基于DRY原则精简两个键名不同的相似TypeScript接口

解决方案

你可以通过TypeScript映射类型+自定义大小写转换工具类型实现DRY原则,只需要维护一份字段类型定义,就能自动生成两种命名风格的独立接口。

方法一:基于下划线结构生成驼峰接口

先实现下划线转驼峰的工具类型,再定义唯一的下划线结构,最后通过映射类型生成驼峰接口:

// 下划线转驼峰的工具类型
type SnakeToCamel<S extends string> = S extends `${infer T}_${infer U}`
  ? `${T}${Capitalize<SnakeToCamel<U>>}`
  : S;

// 维护唯一的下划线结构定义
type BaseSnakeStructure = {
  key_one: string;
  key_two: number;
};

// JSON格式接口直接复用基础结构
interface MyJsonInterface extends BaseSnakeStructure {}

// 自动生成驼峰式接口
interface MyInterface {
  [K in keyof BaseSnakeStructure as SnakeToCamel<K>]: BaseSnakeStructure[K];
}

方法二:基于驼峰结构生成下划线接口

如果更习惯维护驼峰结构,可反过来实现驼峰转下划线的工具类型:

// 驼峰转下划线的工具类型
type CamelToSnake<S extends string> = S extends `${infer T}${infer U}`
  ? T extends Capitalize<T>
    ? `_${Lowercase<T>}${CamelToSnake<U>}`
    : `${T}${CamelToSnake<U>}`
  : S;

// 维护唯一的驼峰结构定义
type BaseCamelStructure = {
  keyOne: string;
  keyTwo: number;
};

// JavaScript格式接口直接复用基础结构
interface MyInterface extends BaseCamelStructure {}

// 自动生成下划线格式接口
interface MyJsonInterface {
  [K in keyof BaseCamelStructure as CamelToSnake<K>]: BaseCamelStructure[K];
}

效果说明

两种方式都只需要维护一份核心的字段类型定义,另一个接口完全通过类型推导生成,既避免了代码重复,又保证两个接口的键名完全独立(一个下划线、一个驼峰),完全符合需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 09:18:29