Hoi hoi! 👋

我是 @nyaomaru,一位前端工程師,但其實我對螃蟹過敏!🙀🦀

今天,我又要發表一個令人興奮的公告!

我剛剛釋出了一個新的開源工具,叫做 type-tune!🦀🎉

https://github.com/necoz-oss/type-tune

https://type-tune-docs.vercel.app/

這是一個用 Rust 🦀 打造的小型 CLI 工具,能幫助你找出共用的 TypeScript 型別,並把它們移到更合適的位置。

掃描。檢視。移動。驗證。

聽起來很簡單,對吧?

沒錯,這正是它的設計理念!😸


🐈 type-tune 是什麼?

如果你曾經做過大型 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,這樣我們就不用手動在專案裡追著參照關係跑。

type-tune workflow

不同於專注於未使用程式碼的 Knip,type-tune 著重於整理那些實際上仍在使用的型別。

它們是互補的工具!

一個幫我們移除不需要的東西。另一個幫我們整理仍然需要的東西。😸


💡 我為什麼要做它?

這個想法其實來自我自己的經驗。

我當時正在重構一個超過 30 萬行程式碼的正式環境程式碼庫。

而有一件事一直困擾著我。

我們沒有好好利用既有的型別。

即使是在同一個功能模組中,本來可以共用的型別,有時也會被分開宣告。

有些型別逐漸變成了共用依賴,但它們所在的位置仍然反映了最初被建立時的脈絡。

隨著程式碼庫變大,維護這些關係變得越來越困難。

還有一件事我也注意到了。

🤖 在 AI 時代,型別更有價值

我最近很常使用 AI 輔助開發。

在這段經驗中,我對 TypeScript 的型別系統有了更深的體會。

型別不只是用來抓錯誤而已。

它們也可以成為 AI 程式編寫代理人的有用護欄。 🛤️

定義清楚的型別,有助於傳達應用程式的結構、資料之間的關係,以及程式碼應遵循的契約。

以我的經驗來說,讓這些契約清楚明確,是建立有效 AI 開發工作流程的重要一環。

但這裡有個問題!

如果我們的型別被重複定義、分散各處,或維護得不好,就無法充分利用這些資訊。

所以我開始想:

為什麼沒有一個工具能幫我們自動維護型別的結構呢?

我找了一圈,但沒找到真正解決我心中問題的工具。

所以……

我決定自己做一個! 🦀🎉

耶!!!


🚀 如何使用 type-tune

上手其實非常簡單!

📦 安裝

你可以從 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 或以上版本。

🔍 步驟 1:找出共用型別

首先,掃描你的 TypeScript 專案

npx type-tune scan --project tsconfig.json

type-tune 會分析你的專案,找出可搬移的候選專案。

預設情況下,它會尋找被至少另外兩個檔案參照的已匯出型別與介面。

而且不用擔心!

掃描不會修改你的程式碼。 😸

📋 步驟 2:建立重構計畫

接著,產生一份計畫

npx type-tune plan \
  --project tsconfig.json \
  --out .type-tune/plan.json \
  --markdown .type-tune/plan.md

這會建立一份 JSON 計畫與一份可供你檢視的 Markdown 檔案。

你可以查看找到哪些型別、目前宣告在哪裡,以及可以搬移到哪裡。

🐈 步驟 3:檢視變更

這裡有一個很重要的地方!

type-tune 不會自動決定把所有東西都搬移。

每個候選項一開始都會是 ignore。

你可以檢視這份計畫,並決定哪些宣告應該真的要搬移。

npx type-tune review \
  --markdown .type-tune/plan.md

你也可以手動編輯 Markdown 計畫。

我希望這個工具能自動處理繁瑣的工作,同時把架構決策保留在開發者手中。

自動化很有用,但掌控權也同樣重要! 😸

🦀 步驟 4:套用變更

當你檢視完計畫後,就可以預覽重構結果

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 吧!

我把 type-tune 以 Necoz 的名義釋出,是因為我希望能和其他開發者一起把它做起來!😸💚

https://github.com/necoz-oss

而這一次,是用 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 的經驗!

敬請期待!🦀

感謝閱讀,祝你寫程式愉快!😸🙌


💚 加入我們的 Necoz 社群!

喔,還有一件事!😸

我們在 DEV 上也有一個 Necoz 社群!🎉

https://dev.to/necoz

不管你是開發者、寫作者,還是只是純粹好奇,都歡迎加入!

想加入嗎?在下方留言,我就會寄邀請給你! 💌

不用有壓力,也沒有任何義務。就來一起聊聊、互相交流吧!🐈

小巧。簡單。有用。一起打造! 💚


原文出處:https://dev.to/necoz/meet-type-tune-give-your-typescript-types-a-better-home-1p6l


精選技術文章翻譯,幫助開發者持續吸收新知。

共有 0 則留言


精選技術文章翻譯,幫助開發者持續吸收新知。
🏆 本月排行榜
🥇
boluoji
📝31   💬3   ❤️6
708
🥈
站長阿川
📝3   💬2   ❤️2
176
🥉
mike
1
評分標準:發文×10 + 留言×3 + 獲讚×5 + 點讚×1 + 瀏覽數÷10
本數據每小時更新一次
📢 贊助商廣告 · 我要刊登