TypeScript中的感叹号
用作类型断言
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) 的代码,表示代码逻辑确实是这样的。
参考资料
TypeScript 3.7 release log
类型守卫与类型断言
TypeScript中的感叹号相关推荐
- Typescript中的问号点(?.)是什么意思?
问题 Typescript中的感叹号点.问号点是什么意思?我刚入坑react项目的时候看别人代码就看到这样的写法,以开始是懵逼的哈哈哈哈,毕竟是个小白,然后吭哧吭哧的百度查资料,最后发现了问号点(?. ...
- typescript中的 as、问号、感叹号
as 关键字用于断言 在Typescript中,表示断言有两种方式.一种是扩号表示法: let someValue: any = "this is a string"; let s ...
- 如何在TypeScript中删除数组项?
本文翻译自:How do I remove an array item in TypeScript? I have an array that I've created in TypeScript a ...
- typeScript面试必备之-通识七:typeScript中的可索引接口(数组,对象)+类类型接口...
可索引接口:数组.对象的约束 (不常用) ts定义数组的方式 var arr:number[]=[2342,235325]var arr1:Array<string>=['111','22 ...
- linux命令行中,双引号中的感叹号将被解释为历史命令
linux命令行中,双引号中的感叹号将被解释为历史命令. 命令: test -e ttt/ && echo "file exist!" || echo " ...
- Typescript中使用Axios
1)Vue.prototype 在vue项目main.js文件中: Vue.prototype.$appName = 'My App' 这样你可以通过在原型上定义它们使其在每个 Vue 的实例中可用. ...
- JavaScript 和 typeScript 中的 import、from
From:https://segmentfault.com/a/1190000018249137?utm_source=tag-newest Github - allowSyntheticDefaul ...
- angular 字符串转换成数字_Angular日期在TypeScript中格式化转换应用
组件模板中我们常常使用Angular内置管道DatePipe将其日期格式化,如同{{ startTime | date:'yyyy-MM-dd' }}这般操作,即可转换为字符串格式.那么在TS文件中我 ...
- gettype获取类名_在TypeScript中运行时获取对象的类名
在TypeScript中运行时获取对象的类名 是否可以使用typescript在运行时获取对象的类/类型名称? class MyClass{} var instance = new MyClass() ...
最新文章
- 数字货币 electron cash钱包 如何长时间存放数字货币
- ugui unity 取消选择_Unity暑期萌新入门:环境篇
- cvtColor函数
- 【技术综述】你真的了解图像分类吗?
- 从零开始做一个SLG游戏(三):用unity绘制图形
- js 中对于 css 的变量操作(React也可)
- Java8 函数式对齐约定————Eclipse自定义代码风格
- 互联网晚报 | 1月25日 星期二 | 知乎首次举办上星晚会;微信视频号上线首个付费直播间;淘宝天猫“春节不打烊”活动正式上线...
- 华为天才少年1万块自制机械臂,网友:200万给少了
- Linux 网卡驱动学习(九)(层二转发)
- c语言控制led以1s速度,C语言使用定时器的方法控制LED灯以1S的速度闪亮
- oracle统计信息
- opencv 人脸识别_python基于openCV人脸识别18行代码实现
- django高级应用(分页功能)
- iOS开发字符串倒序,倒序单词字母,不倒序单词位置
- 企业生存与发展的前提是安全
- 核心期刊为什么难发?
- [python][project][爬虫] 堆糖网图片下载
- c语言函数初始化,c语言初始化输入和输出函数
- Spring源码分析总结(二)-Spring AOP 解析aop:aspectj-autoproxy
热门文章
- 蚂蚁实时低代码研发和流批一体的应用实践
- Delphi 2021年计划拓展开源社区合作、重返Delphi教学领域并为Delphi支持Python低代码开发平台(LCDP)发展Delphi生态系统
- 永磁电机直轴交轴理解
- 三星手机无法读取相册图片
- 中小企业ERP选型实战
- [redis 源码走读] 主从数据复制(上)
- MySQL讲义第27讲——select 查询之自连接查询
- android uid.system,android.uid.system
- 计算机专业英语问,如何翻译计算机专业英语?
- 中国联通千兆网络准备在即 百卓网络喜获“千兆宽带设备合作伙伴”奖