iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
自我挑戰組

程式碼 AI 寫,我負責看懂:30 天拆解 React × TypeScript系列 第 27

Day 27|換我檢查 AI 修改後的程式碼

  • 分享至 

  • xImage
  •  

AI 改完不代表可以直接接受

Day 25 透過 Code Review 發現 loadItems() 沒有檢查資料格式,Day 26 則把問題整理成明確需求,再交給 AI 修改。

AI 完成後表示:

  • 只修改了 storage.ts
  • 沒有安裝新的套件
  • Lint 與 TypeScript 檢查都通過
  • 格式不正確時會回傳空陣列

因為這些一樣都是由 AI 提供的結果,所以如果看到「檢查通過」,就覺得應該沒什麼問題吧?然後直接接受,感覺也只是換個方式相信 AI 而已。所以這次想試著自己對照修改後的程式碼與檢查結果,看看它是不是真的有按照需求運作。

對照原本提出的需求

先回頭確認自己在 Day 26 提出的內容:

JSON.parse() 後確認資料是陣列,並檢查每一筆資料是否符合 CollectionEntry 的格式。資料格式不正確時,回傳空陣列。

AI 新增了 isCollectionEntry(),逐一檢查:

  • 資料是不是物件,而且不是 null
  • idtitle 是否為字串
  • type 是否為 mangaanime
  • status 是否為 wantwatchingcompleted

loadItems() 也加入:

Array.isArray(parsedItems)

確認最外層是陣列,再使用:

parsedItems.every(isCollectionEntry)

確認陣列中的每一筆資料都通過檢查。
從程式碼來看,修改內容確實有對應到原本提出的需求。

執行基本檢查

接著執行專案原本的 Lint:

npm run lint

結果沒有出現錯誤。

另外也執行 TypeScript 檢查:

npm exec tsc -- --noEmit -p tsconfig.app.json

--noEmit 表示只進行型別檢查,不另外產生 JavaScript 檔案。這項檢查也成功通過。
到這邊至少可以先確認,AI 新增的內容沒有造成明顯的規則或型別錯誤。

準備不同的資料測試

只有檢查工具通過還不夠,因為這次修改的重點是處理 localStorage 裡不同格式的資料。
所以除了正常資料之外,也整理了幾種需要確認的情況:

測試情況 預期結果
沒有保存資料 回傳空陣列
保存正常的收藏陣列 成功讀取收藏資料
JSON 格式錯誤 回傳空陣列
JSON 正確,但內容不是陣列 回傳空陣列
是陣列,但其中一筆資料格式錯誤 回傳空陣列

測試時可以使用另外開啟的無痕視窗,避免影響瀏覽器中原本保存的收藏資料。

最後,這幾種情況都得到預期結果:

沒有資料:PASS
正常資料:PASS
錯誤 JSON:PASS
不是陣列:PASS
單筆格式錯誤:PASS

這表示新增的檢查不只可以處理 JSON.parse() 失敗,也能處理「JSON 可以成功還原,但內容不是收藏資料」的情況。

檢查通過就代表完全沒問題嗎?

這次的修改通過了基本檢查,也符合原本提出的需求,但這不代表程式從此就不可能出錯。
目前只是測試了幾種比較容易想到的情況,如果未來又替 CollectionEntry 增加新的作品類型或觀看狀態,isCollectionEntry() 裡的檢查可能也要記得一起調整。
但和修改前相比,現在至少不會在 JSON.parse() 成功後就直接相信資料,而是多了一層實際的格式確認。
測試的目的不是證明程式永遠不會出錯,而是確認這次修改確實處理了原本發現的問題。

今日回顧

  • AI 修改完成後,仍然要確認修改內容是否符合需求
  • Lint 和 TypeScript 檢查通過,不代表實際資料一定沒有問題
  • 除了正常資料,也要準備錯誤格式進行測試
  • 這次修改通過了幾種不同資料的檢查
  • 測試可以增加對修改結果的信心,但不能保證永遠不會出錯

從 Day 25 找到問題、Day 26 把修改交給 AI,再到這次自己重新檢查,算是走完了一次從發現問題到確認結果的流程。AI 可以負責產生修改,但看懂它改了什麼、確認是否符合需求,仍然是自己需要做的事情。
下篇見~


上一篇
Day 26|發現問題後,把修改交給 AI
下一篇
Day 28|從模糊需求到明確修改,慢慢學會如何問 AI
系列文
程式碼 AI 寫,我負責看懂:30 天拆解 React × TypeScript30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言