那些项目中常见的TypeScript错误总结

 更新时间:2022年03月18日 09:47:02   作者:方章河 翻译  
这篇文章主要给大家总结介绍了一些项目中常见的TypeScript错误的相关资料,如果你想查看所有的错误信息和错误码,可以浏览TypeScript的源代码仓库,当然随着 ts 版本的更新,官网也会逐渐增加更多新的类型错误,需要的朋友可以参考下

引言

TypeScript 错误信息由错误码和详细信息组成。例如:TS2456 ,其中错误码是以“TS”开头 + 数字(一般是 4 位数字)结尾这样的格式组成的字符串,用来作为特定类型错误的专属代号。下面我们看一下那些常⻅,但在官方文档甚少提及的类型错误:

1.TS2456

首先是由于类型别名循环引用了自身造成的 TS2456 类型错误,如下示例: 

 type T = Readonly<T>;
// TS2456: Type alias 'T' circularly references itself.

在上面这个例子中,对于 T 这个类型别名,如果 TypeScript 编译器想知道 T 类型是什么,就需要展开类型别名赋值的 Readonly 。而为了确定 Readonly 的类型,TypeScript 编译器需要继续判断入参 T 的类型,这就形成了一个循环引用,类似函数循环调用自己,如果没有正确的终止条件,就会一直处于无限循环的状态,所以就会报错。

2.TS2554

另一个常⻅的错误就是TS2554,它是由于形参和实参个数不匹配造成的,如下:

function test(a: number | undefined): string {
  if (a=== undefined) {
   return '';
             }
  return a.toString();
}
test(); // TS2554: Expected 1 arguments, but got 0.
test(undefined);

之所以会报错是因为在 ts 中,undefined 是一个特殊的类型,由于类型为 undefined,并不代表可 缺省,因此示例中的第 8 行提示了 TS2554 错误。

3.TS1169

TS1169 类型错误是在接口类型定义中由于使用了非字面量或者非唯一 symbol 类型作为属性名造成 的,如下:

 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.
};

因为interface 类型的属性必须是字面量类型(string、number) 或者是 unique symbol 类型,所以 在第 2 行提示了 TS1169 错误。

4.TS2345

TS2345 类型错误的原因在于传参时由于类型不兼容造成的,如下:

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'.    ;

如上所示,函数 fn 参数的 val 类型是枚举 A,在 12 行我们传入了与枚举 A 类似的枚举 B 的值,此时 ts 提示了类型不匹配的错误。这是因为枚举是在运行时真正存在的对象,因此 ts 并不会判断两个枚举是否可以互相兼容,所以报错。解决这个错误的方式也很简单,我们只需要让这两个枚举类型互相兼容就行,比如使用类型断言绕过 ts 的类型检查(fn((B.x as unknown) as A);)即可。

5.TS2589

TS2589 类型错误是由泛型实例化递归嵌套过深造成的,如下:

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.    

因为第 1 行的泛型 RepeatX 接收了一个数字类型入参 N,并返回了一个⻓度为 N、元素都是 'X' 的数组类型,所以第 4 行的类型 T1 包含了 5 个 "X" 的数组类型;但是第 6 行的类型 T2 的类型却是 any,并且提 示了 TS2589 类型错误。这是因为 ts 在处理递归类型的时候,最多实例化 50 层,如果超出了递归层数的 限制,ts 便不会继续实例化,并且类型会变为 top 类型 any。 对于上面的错误,我们使用 @ts-ignore 注释忽略即可。

6.TS2322

TS2322 错误是由于字符串字面量类型定义时导致的错误,如下:

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 属性的类型是字符串字面量类型 'block' | 'flex' | 'grid',虽然变量 style 的 display 属性看起来与 CSSProperties 类型完全兼容,但是 TypeScript 提示了 TS2322 类型不兼容的错 误。这是因为变量 style 的类型被自动推断成了 { display: string },string 类型自然无法兼容字符串字面量类型 'block' | 'flex' | 'grid',所以变量 style 不能赋值给 cssStyle。

以上六种便是项目开发中比较常见的几种错误类型,如果你想查看所有的错误信息和错误码,可以浏览TypeScript 的源代码仓库,当然,随着 ts 版本的更新,官网也会逐渐增加更多新的类型错误。

总结

到此这篇关于常见的TypeScript错误总结的文章就介绍到这了,更多相关常见的TypeScript错误内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 前端无感知刷新token以及超时自动退出实现方案

    前端无感知刷新token以及超时自动退出实现方案

    前端需要做到无感刷新token,即刷token时要做到用户无感知,避免频繁登录,下面这篇文章主要给大家介绍了关于前端无感知刷新token以及超时自动退出的实现方案,需要的朋友可以参考下
    2024-01-01
  • C#程序员入门学习微信小程序的笔记

    C#程序员入门学习微信小程序的笔记

    这篇文章主要给大家分享了一位C#程序员入门学习微信小程序的笔记,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • JavaScript动态添加style节点的方法

    JavaScript动态添加style节点的方法

    这篇文章主要介绍了JavaScript动态添加style节点的方法,涉及javascript节点操作的相关技巧,需要的朋友可以参考下
    2015-06-06
  • 利用pixi.js制作简单的跑酷小游戏

    利用pixi.js制作简单的跑酷小游戏

    PixiJS 提供一个适用于所有设备的快速轻量级 2D 库。PixiJS 具有完整的 WebGL 支持,并且可以无缝地回退到 HTML5 的画布。 本文将使用pixi.js制作简单的跑酷小游戏,感兴趣的可以尝试一下
    2022-07-07
  • webpack4手动搭建Vue开发环境实现todoList项目的方法

    webpack4手动搭建Vue开发环境实现todoList项目的方法

    这篇文章主要介绍了webpack4手动搭建Vue开发环境实现todoList项目的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-05-05
  • 微信小程序一周时间表功能实现

    微信小程序一周时间表功能实现

    这篇文章主要介绍了微信小程序一周时间表功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • 详解微信小程序之一键复制到剪切板

    详解微信小程序之一键复制到剪切板

    这篇文章主要介绍了微信小程序一键复制到剪切板,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • 详解JavaScript的回调函数

    详解JavaScript的回调函数

    这篇文章主要介绍了JavaScript的回调函数,帮助大家正确理解和使用 JavaScript中的回调函数,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )

    JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_

    今天在网上看到一篇很有意思的文章(需翻墙),解释了几段非常有趣的 JavaScript 代码。你猜下面这段 JavaScript 代码是什么意思?
    2011-02-02
  • 使用JSON格式提交数据到服务端的实例代码

    使用JSON格式提交数据到服务端的实例代码

    这篇文章主要介绍了使用JSON格式提交数据到服务端的实例代码,代码简单易懂,非常不错,具有参考借鉴价值,需要的朋友参考下
    2018-04-04

最新评论