TypeScript 类型断言的几种实现

 更新时间:2024年01月17日 15:16:18   作者:前端玖耀里  
本文主要介绍了TypeScript 类型断言的实现,有使用关键字as和标签<>两种方式,具有一定的参考价值,感兴趣的可以了解一下

本节介绍类型断言,有使用关键字 as 和标签 <> 两种方式,因后者会与JSX 语法冲突,建议统一使用 as 来进行类型断言。

1. 解释

TypeScript 允许你覆盖它的推断,毕竟作为开发者你比编译器更了解你写的代码。

类型断言主要用于当 TypeScript 推断出来类型并不满足你的需求,你需要手动指定一个类型。

2. 关键字 as

当你把 JavaScript 代码迁移到 TypeScript 时,一个常见的问题:

const user = {}

user.nickname = 'Evan'  // Error, Property 'nickname' does not exist on type '{}'
user.admin = true       // Error, Property 'admin' does not exist on type '{}'

代码解释: 编译器推断 const user: {},这是一个没有属性的对象,所以你不能对其添加属性。

此时可以使用类型断言(as关键字)覆盖其类型推断:

interface User {
  nickname: string,
  admin: boolean,
  groups: number[]
}

const user = {} as User

user.nickname = 'Evan' 
user.admin = true       
user.groups = [2, 6]

代码解释:

第 7 行,这里通过 as 关键字进行类型断言,将变量 user 的类型覆盖为 User 类型。但是请注意,类型断言不要滥用,除非你完全明白你在干什么。

3. 首尾标签

类型断言还可以通过标签 <> 来实现:

interface User {
  nickname: string,
  admin: boolean,
  groups: number[]
}

const user = <User>{} // User类型

user.nickname = 'Evan' 
user.admin = true       
user.groups = [2, 6]

代码解释:

第 7 行,使用 <User>{} 这种标签形式,将变量 user 强制断言为 User 类型。

但是,当你在使用 JSX 语法时,会跟标签 <> 形式的类型断言混淆:

let nickname = <User>Evan</User>  // 这里的 User 指向一个 component

所以,建议统一使用 as type 这种语法来为类型断言。

4. 非空断言 !

如果编译器不能够去除 null 或 undefined,可以使用非空断言 ! 手动去除。

function fixed(name: string | null): string {
  function postfix(epithet: string) {
    return name!.charAt(0) + '.  the ' + epithet; // name 被断言为非空
  }
  name = name || "Bob"
  return postfix("great")
}

代码解释:

第 2 行,postfix() 是一个嵌套函数,因为编译器无法去除嵌套函数的 null (除非是立即调用的函数表达式),所以 TypeScript 推断第 3 行的 name 可能为空。

第 5 行,而 name = name || "Bob" 这行代码已经明确了 name 不为空,所以可以直接给 name 断言为非空(第 3 行)。

5. 双重断言

双重断言极少有应用场景,只需要知道有这种操作即可:

interface User {
  nickname: string,
  admin: boolean,
  group: number[]
}

const user = 'Evan' as any as User

代码解释: 最后一行,使用 as 关键字进行了两次断言,最终变量 user 被强制转化为 User 类型。

6. 小结

本节介绍了几种类型断言的方法,需要注意:

  • 慎用类型断言,除非你真的有把握。
  • 类型断言是一个编译时语法,不涉及运行时。

到此这篇关于TypeScript 类型断言的几种实现的文章就介绍到这了,更多相关TypeScript 类型断言内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • uniapp小程序使用高德地图api实现路线规划的示例代码

    uniapp小程序使用高德地图api实现路线规划的示例代码

    路线规划常用于出行路线的提前预览,我们提供4种类型的路线规划,分别为:驾车、步行、公交和骑行,满足各种的出行场景,这篇文章主要介绍了uniapp小程序使用高德地图api实现路线规划,需要的朋友可以参考下
    2023-01-01
  • Javascript之图片的延迟加载的实例详解

    Javascript之图片的延迟加载的实例详解

    这篇文章主要介绍了Javascript之图片的延迟加载的实例详解的相关资料,这里对延迟加载和异步加载进行了详解和使用方法,需要的朋友可以参考下
    2017-07-07
  • ActiveX控件的使用-js实现打印超市小票功能代码详解

    ActiveX控件的使用-js实现打印超市小票功能代码详解

    这篇文章主要介绍了ActiveX控件的使用-js实现打印超市小票功能代码详解,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 原生js实现简单轮播图

    原生js实现简单轮播图

    这篇文章主要为大家详细介绍了原生js实现简单轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-10-10
  • js getBoundingClientRect() 来获取页面元素的位置

    js getBoundingClientRect() 来获取页面元素的位置

    该方法已经不再是IE Only了,FF3.0+和Opera9.5+已经支持了该方法,可以说在获得页面元素位置上效率能有很大的提高,在以前版本的Opera和Firefox中必须通过循环来获得元素在页面中的绝对位置。
    2010-11-11
  • 原生javaScript实现图片延时加载的方法

    原生javaScript实现图片延时加载的方法

    这篇文章主要介绍了原生javaScript实现图片延时加载的方法,无需通过载入jQuery脚本即可实现图片的延时加载效果,是非常实用的技巧,需要的朋友可以参考下
    2014-12-12
  • ES6新数据结构Map功能与用法示例

    ES6新数据结构Map功能与用法示例

    这篇文章主要介绍了ES6新数据结构Map功能与用法,结合实例形式分析了Map的功能、使用方法及相关注意事项,需要的朋友可以参考下
    2017-03-03
  • JavaScript实现网页留言板功能

    JavaScript实现网页留言板功能

    这篇文章主要为大家详细介绍了JavaScript实现网页留言板功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • JavaScript实现获取年月日时间的方法总结

    JavaScript实现获取年月日时间的方法总结

    这篇文章主要为大家学习介绍了JavaScript如何实现获取年月日以及各种格式的时间,文中的示例代码简洁易懂,感兴趣的小伙伴可以了解一下
    2023-08-08
  • JS前端轻松导出Excel的通用方法详解

    JS前端轻松导出Excel的通用方法详解

    这篇文章主要介绍关于导出Excel通用方法的实用前端技巧,希望能够帮助大家更好地处理数据导出需求,接下来,我将为大家详细介绍这个方法和代码实现,需要的朋友可以参考下
    2023-09-09

最新评论