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

优化TypeScript泛型输出类型:视觉上省略指定键的方法

优化TypeScript查询引擎类型:移除$键前缀以简化IntelliSense显示

核心思路

通过TypeScript的映射类型和模板字面类型,递归处理类型中的所有键,将带$前缀的键名重命名为去掉前缀后的名称,同时完整保留原类型的结构、约束和类型推导能力,让IntelliSense显示更简洁。

实现步骤

1. 定义键名清理辅助类型

创建模板字面类型,专门移除键名的$前缀:

type RemoveDollarPrefix<K extends string> = K extends `$${infer Rest}` ? Rest : K;

2. 递归清理类型所有键

定义递归映射类型,同时处理当前层级及嵌套对象/子查询类型的键:

type CleanKeys<T> = 
  T extends object 
    ? { 
        [K in keyof T as RemoveDollarPrefix<K & string>]: CleanKeys<T[K]> 
      }
    : T;

3. 改造Responsify泛型

将原Responsify泛型的输出类型包裹上CleanKeys,自动移除所有$前缀键:

// 优化后的Responsify泛型
type Responsify<T> = CleanKeys</* 原Responsify内部类型逻辑 */>;

示例对比

原类型定义(简化版)

type $Option = {
  $limit: number;
  $orderBy: string;
};

type WhereClause = {
  $eq: string | number;
  $subquery: Subquery;
};

type Subquery = {
  $select: string[];
  $where: WhereClause;
};

// 原Responsify逻辑
type Responsify<T> = T extends { where: infer W } 
  ? { data: any[]; options: $Option; where: W } 
  : { data: any[]; options: $Option };

优化后的类型效果

应用CleanKeys后,IntelliSense中显示的类型将自动去掉所有$前缀:

  • 原$Option变为{ limit: number; orderBy: string }
  • 原WhereClause变为{ eq: string | number; subquery: Subquery }
  • 嵌套的Subquery递归清理为{ select: string[]; where: WhereClause }

注意事项

  • 若类型中存在非$前缀键与清理后的键名冲突(如同时存在$limit和limit),TypeScript会抛出重复键错误,需提前确保键名唯一性。
  • 基础类型(string、number等)或非对象类型,CleanKeys会直接返回原类型,无额外影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 12:49:50