TypeScript 類型體操提示詞(泛型、條件類型、infer、映射類型:從需求推導類型並逐步講解)
需要寫一個通用的類型(例如從接口定義自動推出請求參數類型、把對象所有字段變成可選的深層版本),或者看不懂別人寫的複雜類型、想系統學習類型體操時用: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。
同款作品
用這條提示詞做出來的作品;原作者會因此獲得積分
還沒有同款,來做第一個。



0 條評論
還沒有評論,來搶沙發~