【发布时间】:2021-08-27 08:12:00
【问题描述】:
我试图在过滤和映射时缩小和类型保护特定对象的属性,但我不完全理解如何做到这一点。
假设我得到了接口 Person 的以下对象数组:
interface IPerson {
name: string;
age: number;
height: number | null;
}
const personArray: IPerson[] = [...]
假设我想先过滤那些不为空的,然后映射结果并对过滤掉的那些做一些事情。
personArray
.filter((person) => person.height !== null)
.map((person) => this.doSomethingAboutIt(person.height))
doSomethingAboutIt 函数只需要一个数字,而不是空值。这就是为什么我想先过滤非空值。但是 TypeScripts 显示一个错误,说 doSomethingAboutIt 期待的是 number,而不是 number | null。甚至认为在地图功能期间不应该有任何空值。当然 TypeScript 还不知道这一点。我以为它会自动推断,但我错了。
如何将类型缩小到仅对象属性上的数字?
谢谢。
【问题讨论】:
-
你需要一个过滤回调的类型保护。
-
是的,但我只是不知道如何在这个例子中完成它。我知道你可以做类似
filter((item): item is Type => item !== null))的事情。但不知道如何处理对象属性。
标签: javascript typescript