用作类型断言

identifier! 从 identifier 的类型里去除了 null 和 undefined

function broken(name: string | null): string {function postfix(epithet: string) {return name.charAt(0) + '.  the ' + epithet; // error, 'name' is possibly null}name = name || "Bob";return postfix("great");
}function fixed(name: string | null): string {function postfix(epithet: string) {return name!.charAt(0) + '.  the ' + epithet; // ok}name = name || "Bob";return postfix("great");
}

本例使用了嵌套函数,因为编译器无法去除嵌套函数的null(除非是立即调用的函数表达式)。 因为它无法跟踪所有对嵌套函数的调用,尤其是你将内层函数做为外层函数的返回值。 如果无法知道函数在哪里被调用,就无法知道调用时name的类型。

检查未调用的函数

一个常见且危险的错误是:忘记调用一个函数,特别是当该函数不需要参数,或者它的命名容易被误认为是一个属性而不是函数时。

interface User {isAdministrator(): boolean;notify(): void;doNotDisturb?(): boolean;
}// 之后…// 有问题的代码,别用!
function doAdminThing(user: User) {// 糟了!if (user.isAdministrator) {sudo();editTheConfiguration();}else {throw new AccessDeniedError("User is not an admin");}
}

在这段代码中,我们忘了调用 isAdministrator,导致该代码错误地允许非管理员用户修改配置!

在 TypeScript 3.7 中,它会被识别成一个潜在的错误:

function doAdminThing(user: User) {if (user.isAdministrator) {//  ~~~~~~~~~~~~~~~~~~~~// error! This condition will always return true since the function is always defined.//        Did you mean to call it instead?

这个检查功能是一个破坏性变更,基于这个因素,检查会非常保守。 因此对这类错误的提示仅限于 if 条件语句中。当问题函数是可选属性、或未开启 strictNullChecks 选项、或该函数在 if 的代码块中有被调用,在这些情况下不会被视为错误:

interface User {isAdministrator(): boolean;notify(): void;doNotDisturb?(): boolean;
}function issueNotification(user: User) {if (user.doNotDisturb) {// OK,属性是可选的}if (user.notify) {// OK,调用了该函数user.notify();}
}

如果你打算对该函数进行测试但不调用它,你可以修改它的类型定义,让它可能是 undefined/null,或使用 !! 来编写类似 if (!!user.isAdministrator) 的代码,表示代码逻辑确实是这样的。

参考资料

  1. TypeScript 3.7 release log

  2. 类型守卫与类型断言

TypeScript中的感叹号相关推荐

  1. Typescript中的问号点(?.)是什么意思?

    问题 Typescript中的感叹号点.问号点是什么意思?我刚入坑react项目的时候看别人代码就看到这样的写法,以开始是懵逼的哈哈哈哈,毕竟是个小白,然后吭哧吭哧的百度查资料,最后发现了问号点(?. ...

  2. typescript中的 as、问号、感叹号

    as 关键字用于断言 在Typescript中,表示断言有两种方式.一种是扩号表示法: let someValue: any = "this is a string"; let s ...

  3. 如何在TypeScript中删除数组项?

    本文翻译自:How do I remove an array item in TypeScript? I have an array that I've created in TypeScript a ...

  4. typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...

    可索引接口:数组.对象的约束 (不常用) ts定义数组的方式 var arr:number[]=[2342,235325]var arr1:Array<string>=['111','22 ...

  5. linux命令行中,双引号中的感叹号将被解释为历史命令

    linux命令行中,双引号中的感叹号将被解释为历史命令. 命令: test -e ttt/ && echo "file exist!" || echo " ...

  6. Typescript中使用Axios

    1)Vue.prototype 在vue项目main.js文件中: Vue.prototype.$appName = 'My App' 这样你可以通过在原型上定义它们使其在每个 Vue 的实例中可用. ...

  7. JavaScript 和 typeScript 中的 import、from

    From:https://segmentfault.com/a/1190000018249137?utm_source=tag-newest Github - allowSyntheticDefaul ...

  8. angular 字符串转换成数字_Angular日期在TypeScript中格式化转换应用

    组件模板中我们常常使用Angular内置管道DatePipe将其日期格式化,如同{{ startTime | date:'yyyy-MM-dd' }}这般操作,即可转换为字符串格式.那么在TS文件中我 ...

  9. gettype获取类名_在TypeScript中运行时获取对象的类名

    在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...

最新文章

  1. 数字货币 electron cash钱包 如何长时间存放数字货币
  2. ugui unity 取消选择_Unity暑期萌新入门:环境篇
  3. cvtColor函数
  4. 【技术综述】你真的了解图像分类吗?
  5. 从零开始做一个SLG游戏(三):用unity绘制图形
  6. js 中对于 css 的变量操作(React也可)
  7. Java8 函数式对齐约定————Eclipse自定义代码风格
  8. 互联网晚报 | 1月25日 星期二 | 知乎首次举办上星晚会;微信视频号上线首个付费直播间;淘宝天猫“春节不打烊”活动正式上线...
  9. 华为天才少年1万块自制机械臂,网友:200万给少了
  10. Linux 网卡驱动学习(九)(层二转发)
  11. c语言控制led以1s速度,C语言使用定时器的方法控制LED灯以1S的速度闪亮
  12. oracle统计信息
  13. opencv 人脸识别_python基于openCV人脸识别18行代码实现
  14. django高级应用(分页功能)
  15. iOS开发字符串倒序,倒序单词字母,不倒序单词位置
  16. 企业生存与发展的前提是安全
  17. 核心期刊为什么难发?
  18. [python][project][爬虫] 堆糖网图片下载
  19. c语言函数初始化,c语言初始化输入和输出函数
  20. Spring源码分析总结(二)-Spring AOP 解析aop:aspectj-autoproxy

热门文章

  1. 蚂蚁实时低代码研发和流批一体的应用实践
  2. Delphi 2021年计划拓展开源社区合作、重返Delphi教学领域并为Delphi支持Python低代码开发平台(LCDP)发展Delphi生态系统
  3. 永磁电机直轴交轴理解
  4. 三星手机无法读取相册图片
  5. 中小企业ERP选型实战
  6. [redis 源码走读] 主从数据复制(上)
  7. MySQL讲义第27讲——select 查询之自连接查询
  8. android uid.system,android.uid.system
  9. 计算机专业英语问,如何翻译计算机专业英语?
  10. 中国联通千兆网络准备在即 百卓网络喜获“千兆宽带设备合作伙伴”奖