打字稿空链和类型缩小

Typescript null chain and type narrowing

我遇到过一个案例,我觉得打字稿没有正确缩小给定的类型。

(value: number[] | null) => {
  if ((value?.length ?? 0) > 0) value[0];
};

if 分支中,它仍然给我一个 Object is possibly 'null',即使如果 valuenull,条件将不成立。

不应该缩小范围吗?为什么 yes/no?

如果这是预期的行为,是否有方便的解决方法?

不是完整答案,但是:

发生这种情况是因为您没有直接检查 null/undefined 并且 TS 自己还没有那么聪明地识别这一点。

您必须选择:

1.更详细但更安全:

像这里一样使用检查:

(value: number[] | null) => {
    if (value ==null && value.length > 0) value[0];
};

或像这里这样的类型保护:

(value: number[] | null) => {
    if (!isnull(value) && value.length > 0) value[0];
};

function isnull(value: any): value is null {
    return value == null;
}

2。确定人群的选项:

说 TS:我确定 就这样做并使用 !符号。喜欢这里:

(value: number[] | null) => {
  if (value?.length ?? 0 > 0) value![0];
};

希望对您有所帮助