如何制作深型护板?

How to make a deep type guard?

我有以下类型:

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 不为空 - 这可能吗?

您必须拼写出来,例如:

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);
};

(您始终可以为其定义类型而不是内联交集。)

Playground link