打字稿空链和类型缩小

时间:2020-04-01 10:14:30

标签: typescript type-narrowing

我遇到一种情况,我觉得打字稿没有正确缩小给定类型。

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

if分支中,即使Object is possibly 'null'value时条件不成立,它仍然给我一个null

这不应该缩小范围,为什么是/否?

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

1 个答案:

答案 0 :(得分:1)

不是完整的答案,但:

之所以发生这种情况,是因为您没有直接检查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];
};

希望这会有所帮助