TypeScript错误信息由错误代码和详细信息组成。例如:TS2456,其中错误代码为“TS”开头+数字结尾(一般为4位)组成的字符串,作为特定类型错误的专属代码。我们来看看官方文档中很少提及的常见类型错误:1.TS2456首先是由于类型别名循环引用自身导致的TS2456类型错误,如下例所示:typeT=Readonly;//TS2456:类型别名“T”循环引用自身。在上面的例子中,对于类型别名T,如果TypeScript编译器想知道T是什么类型,就需要展开类型别名赋值的Readonly。为了判断Readonly的类型,TypeScript编译器需要不断判断输入参数T的类型,这样就形成了循环引用,类似于函数在循环中调用自己。如果没有正确的终止条件,就会一直处于死循环状态,所以会报错。2.TS2554还有一个常见的错误,就是形参和实参个数不匹配导致的,如下:functiontest(a:number|undefined):string{if(a===undefined){返回'??';}返回a.toString();}test();//TS2554:需要1个参数,但得到0.test(undefined);之所以报错是因为在ts中,undefined是一个特殊的类型,因为类型是undefined,并不代表可以默认,所以例子中第8行提示TS2554错误。3.TS1169TS1169类型错误是由于在接口类型定义中使用非文字或非唯一符号类型作为属性名造成的,如下:interfaceObj{[keyin'id'|'姓名']:任意;//TS1169:接口中的计算属性名称必须引用类型为文字类型或“唯一符号”类型的表达式。};因为接口类型的属性必须是文字类型(字符串,数字)或者唯一符号类型,所以在第2行提示TS1169错误。4.TS2345TS2345类型错误的原因是传递参数时类型不兼容,如如下:enumA{x='x',y='y',z='z',}enumB{x='x',y='y',z='z',}functionfn(val:A){}fn(B.x);//TS2345:“B.x”类型的参数不可分配给“A”类型的参数。;如上图,函数fn参数的val类型为枚举A,我们在第12行传入了与枚举A类似的枚举B的值,此时ts提示类型不匹配错误。这是因为枚举是运行时存在的真实对象,所以ts不会判断两个枚举是否兼容,所以会报错。解决这个错误的方法也很简单,我们只需要让两个枚举类型相互兼容即可,比如使用类型断言绕过ts的类型检查(fn((B.xasunknown)asA);).5、TS2589TS2589类型错误是泛型实例化的递归嵌套太深导致的,如下:typeRepeatX=T['length']extendsN?T:RepeatX;输入T1=RepeatX<5>;//=>["X","X","X","X","X"]//TS2589:类型实例化过深并且可能是无限的。因为第1行的泛型RepeatX接收一个数字类型的入参N,返回一个长度为N,元素全为'X'的数组类型,所以第4行的类型T1包含了5个“X”数组类型;但是第6行的类型T2是any,提示TS2589类型错误。这是因为ts在处理递归类型时最多可以实例化50层。如果超过递归层数的限制,ts将不会继续实例化,类型会变成顶级类型any。对于上面的错误,我们可以使用@ts-ignore注解来忽略。6.TS2322TS2322错误是字符串字面量类型定义导致的,如下:interfaceCSSProperties{display:'block'|'弹性'|'网格';}conststyle={display:'flex',};//TS2322:Type'{display:string;}'不可分配给类型'CSSProperties'。//属性'display'的类型不兼容。//类型'string'不可分配给类型'"block"|“弹性”|“网格”'.constcssStyle:CSSProperties=style;在上面的例子中,CSSProperties的display属性的类型是字符串字面量类型'block'|'弹性'|'grid',虽然变量style的显示属性看起来完全兼容CSSProperties类型,但是TypeScript却提示TS2322类型不兼容的错误。这是因为变量style的类型被自动推断为{display:string},string类型自然不兼容string字面量类型'block'|'弹性'|'grid',因此不能将变量样式分配给cssStyle。以上六种是项目开发中比较常见的一些错误类型。如果想查看所有错误信息和错误代码,可以浏览TypeScript源码仓库。当然,随着ts版本的更新,官网会逐渐增加更多新的类型错误。