大佬教程收集整理的这篇文章主要介绍了我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个简单的数字检查方法:
/**
* Uses number.isFinite or combination of checks against typeof,itself (NaN) and Infinity
* @param input
*/
export function isFinite(input: any) :Boolean {
if (isFunction(number.isFinitE)) { // another check,which goes typeof input === 'function'
return number.isFinite(input);
}
return (typeof input === 'number') && (input !== input) && (input !== Infinity);
}
现在我在另一种方法中使用它来获取像这样的可选参数
export function setSessioncookie(token: String,expireHours ?: number) :voID {
const STORAGE_KEY = 'userToken';
if (!isFinite(expireHours)) {
expireHours = 48;
}
const Now = new Date();
// here I get an "Object is possibly 'undefined'. ts(2532)" for 'expireHours'
Now.setTime((Now.getTime() + (expireHours * 60 * 60 * 1000)));
const expire = Now.getTime();
const STORAGE_VALUE = {
token: token,expire: expire
};
window.localstorage.removeItem(STORAGE_KEY);
window.localstorage.setItem(STORAGE_KEY,JsON.Stringify(STORAGE_value));
}
(expireHours || 1)
,但这是一场噩梦。typeof exireHours !== 'number'
替换 if 条件可以解决问题但那时我可能仍然有一个 NaN
。
expireHours
是一个数字,而不是一个或在一个对象中,所以我也可能会得到错误消息。但这不是我在这里的主要观点:检查 undefined
是避免 NaN
结果的一项很好的工作,为此我使用了 TS。
就使用 TS 编译器而不是反对它而言,我如何改进我的检查方法或其在此处的使用,以便在我开始使用 TS 编译器计算时告诉 TS 一切正常范围。添加另一个变量是唯一的方法吗?
问题是您将参数标记为可选,因此编译器正确地抱怨它可能未定义。您可以通过以下三种方式之一“修复”此问题:
这样的类型保护看起来像这样:
function isnumber(n: any): n is number {
return typeof n === 'number';
}
然后它就起作用了:
function isFinite(n: number): Boolean {
if (typeof number.isFinite === 'function') {
return number.isFinite(n);
} else {
return typeof n === 'number' && n === n && n !== -Infinity && n !== Infinity
}
}
function bar(n?: number) {
const x: number = isnumber(n) && isFinite(n) ? n : 48;
const y = x * 60000;
return y;
}
Playground
请注意,这里的类型保护函数并不是绝对必要的,因为我们讨论的是像 number 这样的原始值:
function bar(n?: number) {
const x: number = typeof n === 'number' && isFinite(n) ? n : 48;
const y = x * 60000;
return y;
}
同样有效,但一遍又一遍地键入 typeof x === 'number'
可能很乏味。
如果您不介意将默认值放在函数签名中,它也可以:
function bar(n: number = 48) {
const x: number = isFinite(n) ? n : 48;
const y = x * 60000;
return y;
}
以上是大佬教程为你收集整理的我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?全部内容,希望文章能够帮你解决我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。