代化實戰(zhàn):將 `$TupleMapi` 重構為原生 Mapped Types(以 flow 倉庫 modernize_015 為例))
開發(fā)工具靜態(tài)分析代碼質(zhì)量【免費下載鏈接】flowAdds static typing to JavaScript to improve developer productivity and code quality.項目地址https://gitcode.com/gh_mirrors/flow30/flow點擊查看免費下載導讀本文圍繞 flow 倉庫中 SWE-bench 風格 AI 評測用例modernize_015_tuple_mapi位于 evals/evals/05_code_generation/modernize_015_tuple_mapi展開完整拆解把基于$TupleMapi實用類型的元組映射代碼遷移為原生 mapped types{[K in keyof T]: ...}寫法這一類型現(xiàn)代化任務。讀完本文你將掌握 Flow 中$TupleMapi/$TupleMap的精確語義、與原生映射語法的等價關系、評測任務的自動化驗收方式以及如何在本地復跑這條用例驗證改寫正確性。一、任務本身一句話 prompt 背后的完整上下文該評測的 prompt.md 全文只有一句話Modernize the code inmain.js.任務描述刻意不涉及任何 Flow 語法細節(jié)——這正是本評測套件的設計原則prompt 只描述行為目標what絕不泄露期望的語法表達how。模型的真實工作對象是input/main.js// flow type Columns [string, number, boolean]; type IndexedColumns $TupleMapiColumns, K, V(K, V) [K, V]; export function secondValue(indexed: IndexedColumns): number { return indexed[1][1]; }而參考答案gold patch位于ideal/main.js// flow type Columns [string, number, boolean]; type IndexedColumns {[K in keyof Columns]: [K, Columns[K]]}; export function secondValue(indexed: IndexedColumns): number { return indexed[1][1]; }從目錄結構input/與ideal/分別存放起點與參考解與 evals/README.md 的說明可以看出每個評測實例在編譯階段都會用compile_swebench.py對兩者做 diff 生成 gold patch因此現(xiàn)代化的評判標準是唯一的用 Flow 原生 mapped types 替換$TupleMapi實用類型。二、理解被遷移的類型$TupleMapi的語義$TupleMapi是 Flow 早期為元組tuple提供的工具類型之一它接收兩個參數(shù)第一個參數(shù)一個元組類型這里是[string, number, boolean]第二個參數(shù)一個類型層面的映射函數(shù)形如K, V(K, V) R其中K是元組的下標索引V是下標對應的元素類型。$TupleMapiColumns, K, V(K, V) [K, V]的含義是對Columns的每個位置K取該位置的元素類型V應用映射函數(shù)生成[K, V]。于是得到type IndexedColumns [[0, string], [1, number], [2, boolean]];因此indexed[1][1]的類型是numbersecondValue函數(shù)體可以正確通過類型檢查——這是整個任務能成立的語義前提。與之形成對照的是兄弟用例modernize_014_tuple_map見 evals/evals/05_code_generation/modernize_014_tuple_map/ideal/main.jstype RequestArgs [string, number]; type PendingArgs $TupleMapRequestArgs, V(V) PromiseV; // 現(xiàn)代化后 type PendingArgs {[K in keyof RequestArgs]: PromiseRequestArgs[K]};兩者的差別只在于映射函數(shù)是否接收索引K$TupleMap的映射函數(shù)簽名是V(V) R只映射元素$TupleMapi是K, V(K, V) R索引與元素同時可見。在 native mapped types 中這兩種需求統(tǒng)一由{[K in keyof T]: F(T[K])}表達——需要索引時直接在屬性名位置使用K即可。三、等價改寫從$TupleMapi到原生 Mapped Types將$TupleMapiColumns, K, V(K, V) [K, V]改寫成原生語法要點如下keyof Columns枚舉元組的全部下標。對元組類型[string, number, boolean]而言keyof得到0 | 1 | 2以及l(fā)ength等內(nèi)置屬性但映射僅關注數(shù)值下標。K即下標、Columns[K]即對應元素類型兩者通過[K, Columns[K]]重新組合得到與$TupleMapi完全一致的結果[[0, string], [1, number], [2, boolean]]。消費端代碼完全無需改動indexed[1][1]依然得到numbersecondValue的返回類型注釋保持合法。完整的等價關系可以概括為$TupleMapiT, K, V(K, V) R ≡ {[K in keyof T]: R(K, T[K])} $TupleMapT, V(V) R ≡ {[K in keyof T]: R(T[K])}這也是$TupleMapi/$TupleMap這類歷史實用類型逐漸被原生 mapped types 取代的根本原因原生語法表達能力相同且不再依賴記憶專用工具類型名。四、自動化驗收grader 如何確保真的現(xiàn)代化了評測不只要求能通過類型檢查還通過 AST 級 grader 強制驗證寫法。查看 config.jsongrading: { graders: [ { type: contains_ast_node_type, query: ObjectTypeMappedTypeProperty }, { type: ast_query, selector: .type \GenericTypeAnnotation\ and .id?.name \$TupleMapi\, negate: true } ] }兩條規(guī)則一正一反正向規(guī)則contains_ast_node_type要求產(chǎn)物 AST 中必須出現(xiàn)ObjectTypeMappedTypeProperty節(jié)點——即{[K in keyof Columns]: ...}這種原生映射屬性節(jié)點證明模型確實使用了 mapped types 語法反向規(guī)則ast_querynegate: true要求 AST 中不得存在GenericTypeAnnotation且id.name $TupleMapi的節(jié)點即舊實用類型必須徹底消失。這兩條 grader 正是 evals/README.md 中Grading一節(jié)所描述的機制flow ast輸出 AST 后用jq查詢節(jié)點形狀讓測試某特性的評測確認該特性真的被用到。也就是說即使某模型保留了$TupleMapi并聲稱也算等價只要 AST 中還殘留該節(jié)點就會被判失敗。此外README 還提到所有評測共享一組基線 graderflow_check零 Flow 錯誤、file_modified目標文件必須被修改、no_tsc不得調(diào)用 TypeScript 編譯器等這些會在編譯階段由compile_swebench.py自動附加每個 eval 只需聲明自己額外的規(guī)則。五、本地復現(xiàn)與驗證該評測隸屬于evals/05_code_generation類別從規(guī)格編寫新的類型化代碼。在倉庫根目錄可以按如下方式本地復現(xiàn)驗證前置條件Python 3.9、Node/npm、POSIX shell# 1. 安裝 flow-bin提供預編譯的 flow 可執(zhí)行文件 npm install # 2. 僅針對本用例做 dry-run 驗證應用 gold patch 并跑所有 grader make validate ARGS--eval modernize_015_tuple_mapimake validate即make dry-run不調(diào)用任何模型只把ideal/main.js作為 gold patch 應用隨后依次執(zhí)行flow_check、AST grader 等檢查全部通過即說明該 eval 結構良好、驗收標準與參考解自洽。若使用自建 Flow 二進制可指定python3 run_swebench.py --flow-bin /path/to/flow --dry-run跑真實模型時軌跡與結果會寫入build/swebench/results.json。六、小結這類現(xiàn)代化任務的一般套路從modernize_015_tuple_mapi以及同類的$TupleMap、$ObjMap、$ObjMapi等用例可以提煉出 Flow 類型現(xiàn)代化任務的可復用路徑識別舊實用類型$TupleMapi/$TupleMap/$ObjMap等$前綴工具類型均屬歷史 API確定原生等價式逐一將參數(shù)映射為keyof 索引訪問 映射屬性保持消費端類型不變改寫前后被引用代碼的類型行為必須完全一致這是flow_check通過的前提以 AST 驗證收尾借助ObjectTypeMappedTypeProperty等節(jié)點斷言防止偽現(xiàn)代化。掌握這一套路后你不僅能在 AI 評測場景中正確完成這類任務也能在實際 Flow 代碼庫的日常維護中把歷史遺留的$工具類型平滑遷移到現(xiàn)代語法上。贊分享開發(fā)工具靜態(tài)分析代碼質(zhì)量【免費下載鏈接】flowAdds static typing to JavaScript to improve developer productivity and code quality.項目地址https://gitcode.com/gh_mirrors/flow30/flow點擊查看免費下載相關推薦從staged-recipes到feedstock理解conda-forge自動化流程的內(nèi)部機制從staged recipes到feedstock理解conda forge自動化流程的內(nèi)部機制 conda forge作為開源軟件包管理的重要平臺其自動化開發(fā)工具靜態(tài)分析代碼質(zhì)量數(shù)據(jù)工程師必備Awesome Pydantic中的數(shù)據(jù)處理與驗證工具數(shù)據(jù)工程師必備Awesome Pydantic中的數(shù)據(jù)處理與驗證工具 在數(shù)據(jù)工程領域數(shù)據(jù)處理與驗證是確保數(shù)據(jù)質(zhì)量的關鍵環(huán)節(jié)。GitHub加速計劃中的Awes開發(fā)工具靜態(tài)分析代碼質(zhì)量纏論量化交易終極指南10個技巧讓您從新手變高手纏論量化交易終極指南10個技巧讓您從新手變高手 您是否曾因復雜的纏論理論望而卻步是否因人工分析耗時耗力而錯過交易機會Chanlun Pro為您提供了一站式開發(fā)工具靜態(tài)分析代碼質(zhì)量上一篇Onyx 項目安裝與配置指南下一篇【親測免費】 MoeKoeMusic項目安裝與配置指南創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考