同事報案,在沒動 TypeScript 的情況下,專案爆出大量 TypeScript 錯誤導無法編譯。 錯誤訊息滿是各式各樣的 A is not assignable to parameter of type B。


目擊證人指出,問題出現在 VS2017 安裝更新後,VS 更新成為最大嫌疑犯。深入調查後案情逆轉,發現 TypeScript 2.3 版本被移除,專案屬性設定 TypeScript 原指定 2.3 版,目前顯示為 2.3 (Unavailable)。

延伸閱讀:檢查 TypeScript 安裝版本

進一步檢查,問題開發機在新裝 2.5 時移除了 2.3,懷疑 Visual Studio 找不到 2.3 改用 2.5,因而造成問題。重裝 2.3,再將 TypeScript 編譯版本改回 2.3 即不再出錯。

但有個詭異狀況,在另一個擁有相同 TypeScript 的專案測試,改用 2.5 版 TypeScript,卻能編譯成功,證明既有 TypeScript 仍與 2.5 版相容。深入比對,發現問題專案有個 tsconfig.json,移除後用問題專案就能 2.5 編譯了。

爬文得到以下結論:

故事是 TypeScript 2.4 提高了泛型檢查的嚴謹性(Improved checking for generics),
許多舊程式無法通過新標準必須修改,由於此一 Break Change 可能讓大量 TypeScript 一夕之間「就地違法」,哀鴻遍野,故 TypeScript 留了一條活路。有個 --noStrictGenericChecks
參數允許 TypeScript 2.4+ 沿用較寬鬆的舊標準,以確保原有程式在升級時不用全面修改。

猜測使用專案屬性設定 TypeScript 編譯參數時預設啟用 noStrictGenericChecks,一旦改用 tsconfig.json,noStrictGenericChecks 預設則關閉,因而導致問題。

不過,我試著在 tsconfig.json 加入  "compilerOptions": { "noStrictGenericChecks": true },卻無法克服使用 TS 2.5 編譯出錯的狀況。詳細原因與 tsconfig.json 運作原理目前對我都是謎,留待日後研究,目前的解決之道是升級 2.5 時避用 tsconfig.json 改以 csproj 屬性設定 TypeScript 編譯參數。


Comments

Be the first to post a comment

Post a comment