在 TypeScript 中缩小过滤器和映射链中对象属性的类型

msq*_*qar 3 javascript typescript

我试图在过滤和映射时缩小和类型保护特定对象的属性,但我不完全理解如何做到这一点。

假设我得到了 Person 接口的以下对象数组:

interface IPerson {
   name: string;
   age: number;
   height: number | null;
}

const personArray: IPerson[] = [...]
Run Code Online (Sandbox Code Playgroud)

假设我想首先过滤那些不为空的内容,然后映射结果并对过滤掉的内容执行一些操作。

personArray
   .filter((person) => person.height !== null)
   .map((person) => this.doSomethingAboutIt(person.height))
Run Code Online (Sandbox Code Playgroud)

doSomethingAboutIt函数只需要一个数字,而不是空值。这就是为什么我想首先过滤非空。但 TypeScripts 显示一个错误,指出 doSomethingAboutIt 需要 a number,而不是 a number | null。甚至认为在映射函数期间不应该有任何空值。当然 TypeScript 还不知道这一点。我以为它会自动推断出来,但我错了。

如何将类型缩小为仅对象属性的数字?

谢谢。

小智 5

您需要按如下方式使用类型保护:

interface IPerson {
    name: string;
    age: number;
    height: number | null;
}

const doSomethingAboutIt = (h: number) => {};

const personArray: IPerson[] = [];
personArray
    .filter((person): person is IPerson & { height: number } => person.height !== null)
    .map((person) => doSomethingAboutIt(person.height));
Run Code Online (Sandbox Code Playgroud)