类型守卫

目的

来缩小目标类型
型守卫是您通过代码影响代码流分析的功能

类型

  • in 操作符
  • instanceof
  • typeof
  • is 操作符

    代码

    ```typescript interface Order { address: string; } interface TelephoneOrder extends Order { callerNumber: string; } interface InternetOrder extends Order { email: string; } // 然后定义一个可能是两种订单子类型之一或 undefined 的类型。 type PossibleOrders = TelephoneOrder | InternetOrder | undefined;

// 创建一个函数,返回 PossibleOrders 类型。 declare function getOrder(): PossibleOrders; const possibleOrder = getOrder();

// 我们可以使用 ‘in’ 操作符来检查某个特定的键存在在对象上, // 以缩小并集类型的范围 (’in’ 是 JavaScript中用来检查对象上键是否存在的操作符)。

if (“email” in possibleOrder) { const mustBeInternetOrder = possibleOrder; }

// 如果您有符合接口的类,可以使用 JavaScript 中 ‘instanceof’ 操作符来检查。

class TelephoneOrderClass { address: string; callerNumber: string; }

if (possibleOrder instanceof TelephoneOrderClass) { const mustBeTelephoneOrder = possibleOrder; }

// 你可以使用 JavaScript 中 ‘typeof’ 操作符来缩小您的并集类型。 // 它只对于 JavaScript 中的基本类型起作用(例如字符串,对象,数组等)。

if (typeof possibleOrder === “undefined”) { const definitelyNotAnOder = possibleOrder; }

function isAnInternetOrder(order: PossibleOrders): order is InternetOrder { return order && “email” in order; }

function isATelephoneOrder(order: PossibleOrders): order is TelephoneOrder { return order && “calledNumber” in order; }

// 现在我们可以使用这些函数在 if 语句中缩小 possibleOrder 的可能的类型:

if (isAnInternetOrder(possibleOrder)) { console.log(“Order received via email:”, possibleOrder.email); }

if (isATelephoneOrder(possibleOrder)) { console.log(“Order received via phone:”, possibleOrder.callerNumber); }

```

类型断言

目的

不满足条件时直接用as来解决

双重断言

as any as Person
注意:

  • 双重断言子类型可以转化为另一种子类型
  • 尽量别用双重类型,会破坏原有的关系
  • 子类型可以断言给父类型 any类型可以赋值给任何类型(never除外)