typescript - 如何在 TypeScript 中编写类型安全的断言函数?
问题描述
TypeScript 3.7 有这个新的很酷的特性,它使我们能够编写“断言函数”。例如,这是我的一个:
export type TOfferAttrName = keyof typeof offerAttrMap;
export const assertIsOfferAttrName = (name: string): asserts name is TOfferAttrName => {
if (!Object.prototype.hasOwnProperty.call(offerAttrMap, name)) {
throw new Error('It is required that property name is an allowed one');
}
};
问题是没有什么强迫我写一个正确的断言函数。我几乎可以省略整个函数体,TS 会非常满意。因此,它完全等同于乐观地进行类型转换as
。
我是否遗漏了什么,有没有办法让 TS 真正强迫我写一个正确的断言函数?
解决方案
断言的想法(与类型保护一样)是作为程序员的你可能是 TypeScript 没有的东西,并且你想让类型系统意识到这一点。
因此,在您知道某些东西始终是“X”类型的情况下,使用断言assertIsT(obj: any): asserts obj is T {}
是一个完全有效的点,您知道 obj 绝对是 T并且您希望编译器也知道这一点。
可以这么说,类型保护和断言函数是一个比强制类型转换和任何类型更优雅的逃生舱口。编译器不会检查它们,但相信你。
推荐阅读
- git - 为什么你会隐藏更改而不是创建本地提交或临时分支?
- css - 样式化组件覆盖父道具类型
- graphql - GraphQL 字段解析器永远不会被调用
- jupyter-contrib-nbextensions - jupyter notebook 中不完整的 nbextensions(仅显示 5 个扩展)
- python - 用对象在现有绘图上添加 3d 点
- mysql - 在 MySQL 过程中获取给定父节点的所有子节点(及其子节点)
- c++ - 如何删除向量指针?
- c# - 在 C# 图表中创建 StackedColumn100
- spring-boot - 如何与 SpringBoot 应用程序进行 Okta SSO 集成?并且所有用户管理都在 Okta 这边
- python - 如何在 odoo 的看板视图中更改 on_create 属性