我感兴趣的是构建这样的类型谓词函数,当数字是实数时,它将返回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中是否有任何方法可以使用单个函数来正确地缩小类型范围,而有时在求反时也不会生成错误的类型?