@ts-ignore vs @ts-expect-error
@ts-ignore 與 @ts-expect-error 的使用時機差異
前言
近期在替專案做大型重構,其中就有將技術轉換為 TypeScript 與 Monorepo,途中一些還沒有頭緒如何解決的型別問題,就會使用 @ts-ignore
或 @ts-expect-error
來先行忽略,但這兩者的使用時機有所不同,這篇文章就來談談這兩者的差異。
@ts-ignore
只要在註解中撰寫 @ts-ignore
TypeScript 就會忽略下一行的型別檢查,通常是因為該行的型別檢查會報錯,但我們確定該行的程式碼是正確的,所以就可以使用 @ts-ignore
來忽略型別檢查。
由於將字串指定給數字所以在靜態檢查時 TS 會報錯,於是我們透過 @ts-ignore
來忽略該行的型別檢查。
@ts-expect-error
@ts-expect-error
與前者功能一致,但差別在於可以確定下一行程式碼會報錯,如果該行的程式碼沒有報錯,則會報錯。
上面的程式碼會報錯,因為我們將字串指定給數字,但我們確定這樣是錯誤的,所以就可以使用 @ts-expect-error
來確保該行的程式碼會報錯。
結論
@ts-ignore
是用來忽略某一行的型別檢查,而@ts-expect-error
是用來確保某一行的程式碼會報錯再忽略,這兩者的使用時機有所不同,
@ts-expect-error
是 TypeScript 於 3.9 版本添加的新功能,大多時候我會偏好更積極檢測問題的 @ts-expect-error
,並且堅持撰寫忽略錯誤的原因,避免忽略到其他問題。
-
選擇
@ts-ignore
的情況:- 真的沒有時間決定哪個選項更合適。
- 項目規模較大,且新出現的錯誤在代碼中沒有明確的負責人。
- 正在進行 TypeScript 兩個不同版本之間的升級,且某行代碼在一個版本中報錯而在另一個版本中不報錯。
-
選擇
@ts-expect-error
的情況:- 正在編寫測試代碼,實際上希望型別系統對某個操作報錯。
- 預期問題會很快得到解決,因此只需要一個臨時的解決方案。
- 項目規模適中,且團隊積極主動,會在受影響的代碼恢復有效後盡快移除抑制註解。