TypeScript 类型体操提示词(泛型、条件类型、infer、映射类型:从需求推导类型并逐步讲解)

需要写一个通用的类型(例如从接口定义自动推出请求参数类型、把对象所有字段变成可选的深层版本),或者看不懂别人写的复杂类型、想系统学习类型体操时用:AI 从需求推导类型,分步构造并解释每个语法,附类型测试用例。

NNathaniel bigo··原创首发·AI 辅助撰写
通用大模型 对话模型通用
你是一名 TypeScript 类型系统专家,也是一位耐心的老师。

- 模式:[帮我写类型/解释这个类型/出练习题]
- TypeScript 版本:[如 5.6]
- 需求或要解释的类型:
  [需求描述或类型代码]
- 期望的效果(输入类型 → 输出类型的例子):
  [例子]
- 我的水平:[我的水平](例:会用基础泛型,不熟悉条件类型和 infer)

写类型时:
1. 先说明能否用内置工具类型(如 Partial、Required、Pick、Omit、Record、ReturnType、Parameters、Awaited、NonNullable)组合完成;能组合完成的,不要自己从零造。
2. 需要自定义时,分步构造:每一步只引入一个新概念(泛型约束、映射类型、键重映射、条件类型、分布式条件类型、infer、模板字面量类型、递归类型),说明这一步做了什么、为什么需要。
3. 处理边界:联合类型输入时是否会被分布处理(以及是否希望如此)、可选属性与 undefined、只读属性、数组与元组、函数类型、递归深度。
4. 写类型测试:用一个「两个类型相等」的工具类型配合若干用例,验证结果符合预期,包括边界情况。
5. 实用性判断:如果这个类型过于复杂、会明显拖慢编辑器或让同事看不懂,提醒我考虑更简单的方案(例如显式声明、代码生成)。

解释类型时:从最外层开始,一层层拆开,对每一层给出「输入一个具体类型,这一层输出什么」的演算过程。

出练习题时:按我的水平出 3 道由浅入深的题,先只给题目和期望效果,等我作答后再批改并讲解。

高亮处换成你自己的内容:[帮我写类型/解释这个类型/出练习题]、[如 5.6]、[需求描述或类型代码]、[例子]、[我的水平]

ChatGPT Plus 充值

已被复制 0 次

使用说明

怎么填变量:[期望的效果] 用「输入什么类型、应该得到什么类型」的例子来写,比文字描述准确得多,例如「输入 { a: string; b?: number },输出 { a?: string; b?: number }」。[我的水平] 决定讲解的深度,初学者模式下每个语法都会单独解释。

常见坑:

  • 条件类型遇到联合类型时会自动对每个成员分别计算(分布式),有时这正是想要的,有时会得到意外的结果。需要整体判断时,可以把类型参数包在方括号元组里阻止分布,这一点要让 AI 讲清楚。
  • 递归类型写得太深,编辑器会变慢甚至报「类型实例化过深」。实际项目中要权衡可读性和性能。
  • 能用 Pick、Omit、ReturnType 组合的,就不要手写一个难以维护的复杂类型。

追问技巧:学习时可以追问「把这个类型改成不使用 infer 的写法,对比两者的区别」,或「给我出一道用到模板字面量类型的变式题」。

示例输出

示例,仅供参考(需求:把对象类型的所有属性递归地变为可选,数组元素也要处理)
ts
type DeepPartial<T> =
  T extends (...args: any[]) => any ? T :                  // 第 1 步:函数保持不变
  T extends readonly (infer U)[] ? readonly DeepPartial<U>[] : // 第 2 步:数组,递归处理元素
  T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } :  // 第 3 步:对象,每个属性可选并递归
  T                                                         // 第 4 步:基本类型原样返回

// 类型测试
type Equal<A, B> = (<X>() => X extends A ? 1 : 2) extends (<X>() => X extends B ? 1 : 2) ? true : false
type Case1 = Equal<DeepPartial<{ a: { b: number } }>, { a?: { b?: number } }>   // true

讲解(第 2 步):infer U 的意思是「如果 T 是某种数组,就把它的元素类型取出来,命名为 U」。例如 T 为 string[] 时,U 就是 string。

同款作品

用这条提示词做出来的作品;原作者会因此获得积分

做同款

还没有同款,来做第一个。

Nathaniel 的更多内容

同主题

同模型

0 条评论

登录 后参与评论

还没有评论,来抢沙发~