那些項(xiàng)目中常見(jiàn)的TypeScript錯(cuò)誤總結(jié)
引言
TypeScript 錯(cuò)誤信息由錯(cuò)誤碼和詳細(xì)信息組成。例如:TS2456 ,其中錯(cuò)誤碼是以“TS”開(kāi)頭 + 數(shù)字(一般是 4 位數(shù)字)結(jié)尾這樣的格式組成的字符串,用來(lái)作為特定類(lèi)型錯(cuò)誤的專(zhuān)屬代號(hào)。下面我們看一下那些常?,但在官方文檔甚少提及的類(lèi)型錯(cuò)誤:
1.TS2456
首先是由于類(lèi)型別名循環(huán)引用了自身造成的 TS2456 類(lèi)型錯(cuò)誤,如下示例:
type T = Readonly<T>; // TS2456: Type alias 'T' circularly references itself.
在上面這個(gè)例子中,對(duì)于 T 這個(gè)類(lèi)型別名,如果 TypeScript 編譯器想知道 T 類(lèi)型是什么,就需要展開(kāi)類(lèi)型別名賦值的 Readonly 。而為了確定 Readonly 的類(lèi)型,TypeScript 編譯器需要繼續(xù)判斷入?yún)?T 的類(lèi)型,這就形成了一個(gè)循環(huán)引用,類(lèi)似函數(shù)循環(huán)調(diào)用自己,如果沒(méi)有正確的終止條件,就會(huì)一直處于無(wú)限循環(huán)的狀態(tài),所以就會(huì)報(bào)錯(cuò)。
2.TS2554
另一個(gè)常?的錯(cuò)誤就是TS2554,它是由于形參和實(shí)參個(gè)數(shù)不匹配造成的,如下:
function test(a: number | undefined): string { if (a=== undefined) { return ''; } return a.toString(); } test(); // TS2554: Expected 1 arguments, but got 0. test(undefined);
之所以會(huì)報(bào)錯(cuò)是因?yàn)樵?ts 中,undefined 是一個(gè)特殊的類(lèi)型,由于類(lèi)型為 undefined,并不代表可 缺省,因此示例中的第 8 行提示了 TS2554 錯(cuò)誤。
3.TS1169
TS1169 類(lèi)型錯(cuò)誤是在接口類(lèi)型定義中由于使用了非字面量或者非唯一 symbol 類(lèi)型作為屬性名造成 的,如下:
interface Obj { [key in 'id' | 'name']: any; // TS1169: A computed property name in an interface must refer to an expression whose type is a literal type or a 'unique symbol' type. };
因?yàn)閕nterface 類(lèi)型的屬性必須是字面量類(lèi)型(string、number) 或者是 unique symbol 類(lèi)型,所以 在第 2 行提示了 TS1169 錯(cuò)誤。
4.TS2345
TS2345 類(lèi)型錯(cuò)誤的原因在于傳參時(shí)由于類(lèi)型不兼容造成的,如下:
enum A { x = 'x', y = 'y', z = 'z', } enum B { x = 'x', y = 'y', z = 'z', } function fn(val: A) {} fn(B.x); // TS2345: Argument of type 'B.x' is not assignable to parameter of type 'A'. ;
如上所示,函數(shù) fn 參數(shù)的 val 類(lèi)型是枚舉 A,在 12 行我們傳入了與枚舉 A 類(lèi)似的枚舉 B 的值,此時(shí) ts 提示了類(lèi)型不匹配的錯(cuò)誤。這是因?yàn)槊杜e是在運(yùn)行時(shí)真正存在的對(duì)象,因此 ts 并不會(huì)判斷兩個(gè)枚舉是否可以互相兼容,所以報(bào)錯(cuò)。解決這個(gè)錯(cuò)誤的方式也很簡(jiǎn)單,我們只需要讓這兩個(gè)枚舉類(lèi)型互相兼容就行,比如使用類(lèi)型斷言繞過(guò) ts 的類(lèi)型檢查(fn((B.x as unknown) as A);)即可。
5.TS2589
TS2589 類(lèi)型錯(cuò)誤是由泛型實(shí)例化遞歸嵌套過(guò)深造成的,如下:
type RepeatX<N extends number, T extends any[] = []> = T['length'] extends N?T: RepeatX<N, [...T, 'X']>; type T1 = RepeatX<5>; // => ["X", "X", "X", "X", "X"] // TS2589: Type instantiation is excessively deep and possibly infinite.
因?yàn)榈?1 行的泛型 RepeatX 接收了一個(gè)數(shù)字類(lèi)型入?yún)?N,并返回了一個(gè)?度為 N、元素都是 'X' 的數(shù)組類(lèi)型,所以第 4 行的類(lèi)型 T1 包含了 5 個(gè) "X" 的數(shù)組類(lèi)型;但是第 6 行的類(lèi)型 T2 的類(lèi)型卻是 any,并且提 示了 TS2589 類(lèi)型錯(cuò)誤。這是因?yàn)?ts 在處理遞歸類(lèi)型的時(shí)候,最多實(shí)例化 50 層,如果超出了遞歸層數(shù)的 限制,ts 便不會(huì)繼續(xù)實(shí)例化,并且類(lèi)型會(huì)變?yōu)?top 類(lèi)型 any。 對(duì)于上面的錯(cuò)誤,我們使用 @ts-ignore 注釋忽略即可。
6.TS2322
TS2322 錯(cuò)誤是由于字符串字面量類(lèi)型定義時(shí)導(dǎo)致的錯(cuò)誤,如下:
interface CSSProperties { display: 'block' | 'flex' | 'grid'; } const style = { display: 'flex', }; // TS2322: Type '{ display: string; }' is not assignable to type 'CSSProperties'. // Types of property 'display' are incompatible. // Type 'string' is not assignable to type '"block" | "flex" | "grid"'. const cssStyle: CSSProperties = style;
在上面的例子中,CSSProperties 的 display 屬性的類(lèi)型是字符串字面量類(lèi)型 'block' | 'flex' | 'grid',雖然變量 style 的 display 屬性看起來(lái)與 CSSProperties 類(lèi)型完全兼容,但是 TypeScript 提示了 TS2322 類(lèi)型不兼容的錯(cuò) 誤。這是因?yàn)樽兞?style 的類(lèi)型被自動(dòng)推斷成了 { display: string },string 類(lèi)型自然無(wú)法兼容字符串字面量類(lèi)型 'block' | 'flex' | 'grid',所以變量 style 不能賦值給 cssStyle。
以上六種便是項(xiàng)目開(kāi)發(fā)中比較常見(jiàn)的幾種錯(cuò)誤類(lèi)型,如果你想查看所有的錯(cuò)誤信息和錯(cuò)誤碼,可以瀏覽TypeScript 的源代碼倉(cāng)庫(kù),當(dāng)然,隨著 ts 版本的更新,官網(wǎng)也會(huì)逐漸增加更多新的類(lèi)型錯(cuò)誤。
總結(jié)
到此這篇關(guān)于常見(jiàn)的TypeScript錯(cuò)誤總結(jié)的文章就介紹到這了,更多相關(guān)常見(jiàn)的TypeScript錯(cuò)誤內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)次數(shù)完整實(shí)例
這篇文章主要介紹了JavaScript統(tǒng)計(jì)字符串中每個(gè)字符出現(xiàn)次數(shù)的方法,以完整實(shí)例形式分析了JavaScript針對(duì)字符串中字符的遍歷操作相關(guān)技巧,需要的朋友可以參考下2016-01-01JS+CSS實(shí)現(xiàn)仿msn風(fēng)格選項(xiàng)卡效果代碼
這篇文章主要介紹了JS+CSS實(shí)現(xiàn)仿msn風(fēng)格選項(xiàng)卡效果代碼,涉及JavaScript響應(yīng)鼠標(biāo)事件動(dòng)態(tài)變換頁(yè)面元素css樣式實(shí)現(xiàn)切換功能的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10JavaScript經(jīng)典案例之簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了JavaScript經(jīng)典案例之簡(jiǎn)易計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-08-08Microsfot .NET Framework4.0框架 安裝失敗的解決方法
今天在安裝.NET Framework 4.0,安裝了半天結(jié)果提示未安裝成功,提示原因是服務(wù)未啟動(dòng)了,error code: (0x80070643), "安裝時(shí)發(fā)生嚴(yán)重錯(cuò)誤 "2013-08-08Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Bootstrap面板(Panels)的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03bootstrap fileinput實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了bootstrap fileinput實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08