为什么Typescript编译器不会推断出这个过滤器typeguard?

Fel*_*ipe 5 type-inference typescript

我试图从数组中过滤掉未定义的值,但无法让编译器正确推断出结果类型.我知道我可以使用类型断言,但更愿意理解如何正确键入我的回调以实现此结果.

const isDefinedNum = (x: number | undefined, _i: number, _a: ReadonlyArray<number | undefined>): x is number => x !== undefined;
const a: (number | undefined)[] = [1, undefined, 2, undefined];
const b = a.filter(isDefinedNum);
Run Code Online (Sandbox Code Playgroud)

在上面,b是类型(number | undefined)[].我正在尝试让编译器使用以下类型来统一调用lib.d.ts:

filter<S extends T>(callbackfn: (this: void, value: T, index: number, array: ReadonlyArray<T>) => value is S): S[];
Run Code Online (Sandbox Code Playgroud)