我希望构建一个类型判断函数,当数字是实数时返回true,并同时使类型更严格:
function isRealNumber(input: number | undefined | null): input is number {
return input !== undefined && input !== null && Number.isFinite(input);
}
然而,在某些情况下,当否定时,这会产生不正确的类型,例如:
const myNumber: number | null = NaN as any;
if (isRealNumber(myNumber)) {
const b = myNumber; // b is number, correct
} else {
const b = myNumber; // b is `null`, should be `null | number`
}
这可以通过在条件语句中使用多个语句来解决,但这并不是最理想的方法。
function isRealNumber(input: number | undefined | null): boolean {
return input !== undefined && input !== null && Number.isFinite(input);
}
const myNumber: number | null = NaN as any;
if (isRealNumber(myNumber) && myNumber !== null && myNumber !== undefined) {
const b = myNumber; // b is number, correct
} else {
const b = myNumber; // b is `null | number`, correct
}
有没有一种方法可以在 TypeScript 中编写一个函数,它能正确地缩小类型,而不会在否定时有时产生错误的类型?