首页 > 解决方案 > 如何在 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

解决方案


断言的想法(与类型保护一样)是作为程序员的你可能是 TypeScript 没有的东西,并且你想让类型系统意识到这一点。

因此,在知道某些东西始终是“X”类型的情况下,使用断言assertIsT(obj: any): asserts obj is T {}是一个完全有效的点,您知道 obj 绝对是 T并且您希望编译器也知道这一点。

可以这么说,类型保护和断言函数是一个比强制类型转换和任何类型更优雅的逃生舱口。编译器不会检查它们,但相信


推荐阅读