如何在TypeScript中编写类型安全断言函数?

时间:2019-12-05 18:00:04

标签: 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是否有办法实际上迫使我编写正确的断言函数?

1 个答案:

答案 0 :(得分:1)

断言(与类型保护一样)的想法是,您作为程序员可能是TypeScript所不具备的,并且您想让类型系统意识到这一点。

因此,在知道某事物始终为“ X”类型的情况下,使用assertIsT(obj: any): asserts obj is T {}的断言是一个非常有效的观点,即您知道obj是肯定是T ,您也希望编译器也知道这一点。

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