Hoi hoi! 👋
我是 @nyaomaru,一位前端工程師,但其實我對螃蟹過敏!🙀🦀
今天,我又要發表一個令人興奮的公告!
我剛剛釋出了一個新的開源工具,叫做 type-tune!🦀🎉
https://github.com/necoz-oss/type-tune
https://type-tune-docs.vercel.app/
這是一個用 Rust 🦀 打造的小型 CLI 工具,能幫助你找出共用的 TypeScript 型別,並把它們移到更合適的位置。
掃描。檢視。移動。驗證。
聽起來很簡單,對吧?
沒錯,這正是它的設計理念!😸
如果你曾經做過大型 TypeScript 專案,應該用過像 Knip 這類工具。
Knip 很棒!🎉
它能幫我們找出未使用的檔案、匯出與相依套件,讓我們更容易整理程式碼庫。
但我一直在思考另一個問題。
那麼,對於仍在被使用、但整理得不太好的型別呢?
TypeScript 的型別非常適合重複使用。
在某個元件中宣告的型別,之後可能會被另一個元件、API 模組,甚至整個功能模組所需要。
但實務上,我們不一定會特別注意維護型別宣告。
例如,假設我們有這樣的程式碼:
// src/features/order/OrderPage.tsx
export type OrderSummary = {
id: string;
total: number;
};
一開始,OrderSummary 可能只會被 OrderPage 使用。
但隨著功能擴展,其他檔案也開始匯入它。
而且有時候,開發者最後會再次宣告出相似的型別,因為他們沒有意識到其實已經存在可重用的東西。
最後,我們可能會面臨:
一切都還是能正常運作!
但它好維護嗎?
嗯,不太好。😹
這就是 type-tune 登場的地方!
type-tune 會找出已經被多個檔案共用的已匯出型別與介面,並協助把它們搬移到更適合的位置。
它也可以更新支援的匯入,並保留相容性 re-export,這樣我們就不用手動在專案裡追著參照關係跑。

不同於專注於未使用程式碼的 Knip,type-tune 著重於整理那些實際上仍在使用的型別。
它們是互補的工具!
一個幫我們移除不需要的東西。另一個幫我們整理仍然需要的東西。😸
這個想法其實來自我自己的經驗。
我當時正在重構一個超過 30 萬行程式碼的正式環境程式碼庫。
而有一件事一直困擾著我。
我們沒有好好利用既有的型別。
即使是在同一個功能模組中,本來可以共用的型別,有時也會被分開宣告。
有些型別逐漸變成了共用依賴,但它們所在的位置仍然反映了最初被建立時的脈絡。
隨著程式碼庫變大,維護這些關係變得越來越困難。
還有一件事我也注意到了。
我最近很常使用 AI 輔助開發。
在這段經驗中,我對 TypeScript 的型別系統有了更深的體會。
型別不只是用來抓錯誤而已。
它們也可以成為 AI 程式編寫代理人的有用護欄。 🛤️
定義清楚的型別,有助於傳達應用程式的結構、資料之間的關係,以及程式碼應遵循的契約。
以我的經驗來說,讓這些契約清楚明確,是建立有效 AI 開發工作流程的重要一環。
但這裡有個問題!
如果我們的型別被重複定義、分散各處,或維護得不好,就無法充分利用這些資訊。
所以我開始想:
為什麼沒有一個工具能幫我們自動維護型別的結構呢?
我找了一圈,但沒找到真正解決我心中問題的工具。
所以……
我決定自己做一個! 🦀🎉
耶!!!
上手其實非常簡單!
你可以從 npm 安裝 type-tune
npm install -D type-tune
或者用 pnpm 安裝(我最喜歡 😸)
pnpm add -D type-tune
你也可以不用安裝到專案裡就直接試用
npx type-tune scan --project tsconfig.json
npm 套件需要 Node.js v22 或以上,並會執行平台相依的原生 Rust binary。
而且因為 type-tune 是用 Rust 寫的,你也可以直接透過 Cargo 從 GitHub 建置並安裝它!📦
cargo install --git https://github.com/necoz-oss/type-tune --tag v1.0.0 type-tune
Rust 原始碼需要 Rust 1.99 或以上版本。
首先,掃描你的 TypeScript 專案
npx type-tune scan --project tsconfig.json
type-tune 會分析你的專案,找出可搬移的候選專案。
預設情況下,它會尋找被至少另外兩個檔案參照的已匯出型別與介面。
而且不用擔心!
掃描不會修改你的程式碼。 😸
接著,產生一份計畫
npx type-tune plan \
--project tsconfig.json \
--out .type-tune/plan.json \
--markdown .type-tune/plan.md
這會建立一份 JSON 計畫與一份可供你檢視的 Markdown 檔案。
你可以查看找到哪些型別、目前宣告在哪裡,以及可以搬移到哪裡。
這裡有一個很重要的地方!
type-tune 不會自動決定把所有東西都搬移。
每個候選項一開始都會是 ignore。
你可以檢視這份計畫,並決定哪些宣告應該真的要搬移。
npx type-tune review \
--markdown .type-tune/plan.md
你也可以手動編輯 Markdown 計畫。
我希望這個工具能自動處理繁瑣的工作,同時把架構決策保留在開發者手中。
自動化很有用,但掌控權也同樣重要! 😸
當你檢視完計畫後,就可以預覽重構結果
npx type-tune apply \
--plan .type-tune/plan.json \
--markdown .type-tune/plan.md \
--dry-run
type-tune 會執行支援的重寫,使用 TypeScript 驗證結果,並在正常的 dry-run 後還原變更過的檔案。
當你對計畫感到滿意時,執行:
npx type-tune apply \
--plan .type-tune/plan.json \
--markdown .type-tune/plan.md
就這樣!🎉
對於支援的轉換,type-tune 會負責搬移宣告、更新型別匯入,並使用 TypeScript 編譯器驗證結果。
當然,你還是應該檢視 Git diff,並執行專案自己的檢查流程。
也有直接抽取的指令!
npx type-tune extract OrderSummary \
--from src/features/order/OrderPage.tsx \
--to src/features/order/types/order.ts \
--project tsconfig.json \
--dry-run
是不是很方便? 😸
我把 type-tune 以 Necoz 的名義釋出,是因為我希望能和其他開發者一起把它做起來!😸💚
而這一次,是用 Rust!🦀
我相信,當我們分享想法、彼此學習,並一起打造東西時,開源會變得更加有趣。
所以,如果你有任何想法、建議,或想要貢獻,我都很想聽聽看!
讓我們一起讓 type-tune 成長起來吧!🐈
這是第一個公開版本,v1!
type-tune 目前專注於 .ts 與 .tsx 檔案中的已匯出 TypeScript type alias 與 interface 宣告。
它目前還不會自動合併重複的型別定義,也還不能處理所有可能的 TypeScript 重構情境。
但我認為,這是讓型別維護更輕鬆的重要第一步。
而且還有很多可以改進的空間!
我們很想聽聽你在維護大型 TypeScript 專案型別時遇到的問題。
也許你也遇到過一樣的挑戰!
又或者,你找到的是完全不同的方法。
不管怎樣,我都很想從你的經驗中學習!💚
type-tune 是開源專案,並且可在 GitHub 上取得!
https://github.com/necoz-oss/type-tune
如果你覺得它有趣,請考慮在 GitHub 上幫它點個 ⭐! 😸
如果你有任何想法、建議,或要回報 bug,也歡迎開 issue 或直接貢獻!
每一點回饋,都能幫助這類小專案變得更好。
喔,還有一件事!
你可能會好奇:
為什麼我選擇用 Rust 而不是 TypeScript 來打造一個 TypeScript 重構工具?nyaomaru 不是很愛 TypeScript 嗎? 🤔
這其實是一段很有趣的故事!
我會在下一篇文章中談談我做這個決定的原因、打造過程中的收穫,以及我使用 Rust 的經驗!
敬請期待!🦀
感謝閱讀,祝你寫程式愉快!😸🙌
喔,還有一件事!😸
我們在 DEV 上也有一個 Necoz 社群!🎉
不管你是開發者、寫作者,還是只是純粹好奇,都歡迎加入!
想加入嗎?在下方留言,我就會寄邀請給你! 💌
不用有壓力,也沒有任何義務。就來一起聊聊、互相交流吧!🐈
小巧。簡單。有用。一起打造! 💚
原文出處:https://dev.to/necoz/meet-type-tune-give-your-typescript-types-a-better-home-1p6l