3

我有一个简单的函数来检查未知值是否看起来像一个Date对象:

function looksLikeDate(obj: unknown): obj is { year: unknown; month: unknown; day: unknown } {
    return (
        obj !== null && typeof obj === "object" && "year" in obj && "month" in obj && "day" in obj
    );
}

但我收到以下"year" in obj部分代码错误:

对象可能为“空”。(2531)

当我切换obj !== null并且typeof obj === "object"错误消失时:TS Playground Link

这不是很奇怪吗?有人可以向我解释一下吗?

4

1 回答 1

2
typeof null === 'object'

如果您在typeof检查后进行null检查,即使您之前检查过,obj 也可以null为空,但是 TS 编译器有点幼稚。

从这个意义上说,这些类型保护有点脆弱,就像在您的示例中一样,typeof obj === 'object'将类型从“not null”更改为object | null

于 2021-10-26T09:19:37.590 回答