优化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
相关产品推荐
相关产品推荐

