【茶包射手日記】TypeScript 出現大量 is not assignable to 錯誤

同事報案,在沒動 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 編譯參數。

歡迎推文分享:
Published 24 December 2017 08:50 AM 由 Jeffrey
Filed under: ,
Views: 6,276



意見

沒有意見

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<December 2017>
SunMonTueWedThuFriSat
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456
 
RSS
創用 CC 授權條款
【廣告】
twMVC

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication