首页 > 解决方案 > 如何做一个深型后卫?

问题描述

我有以下类型:

type Child = {
  foo: number | null
}

type Parent = { 
  child: Child | null
}

我想制作一个类型保护,接收Parent作为参数并确定是否foo是一个数字......类似于:

const guard = (parent: Parent): parent?.child?.foo is number => {
  return isNumber(parent?.child?.foo)
}

我希望 TS 现在能够推断出parent.child不为空 - 这可能吗?

标签: typescripttypeguards

解决方案


你必须把它拼出来,例如:

const guard = (parent: Parent): parent is {child: {foo: number}} => {
    return isNumber(parent?.child?.foo);
};

您可以使用交集类型来做到这一点,如下所示:

const guard = (parent: Parent): parent is Parent & {child: Child & {foo: number;};} => {
    return isNumber(parent?.child?.foo);
};

(你总是可以为它定义一个类型而不是一个内联交集。)

游乐场链接


推荐阅读