打字稿空链和类型缩小
Typescript null chain and type narrowing
我遇到过一个案例,我觉得打字稿没有正确缩小给定的类型。
(value: number[] | null) => {
if ((value?.length ?? 0) > 0) value[0];
};
在 if
分支中,它仍然给我一个 Object is possibly 'null'
,即使如果 value
是 null
,条件将不成立。
不应该缩小范围吗?为什么 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];
};
希望对您有所帮助
我遇到过一个案例,我觉得打字稿没有正确缩小给定的类型。
(value: number[] | null) => {
if ((value?.length ?? 0) > 0) value[0];
};
在 if
分支中,它仍然给我一个 Object is possibly 'null'
,即使如果 value
是 null
,条件将不成立。
不应该缩小范围吗?为什么 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];
};
希望对您有所帮助