程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案??

开发过程中遇到我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?的问题如何解决?下面主要结合日常开发的经验,给出你关于我怎么能告诉 TypeScript 我的 isFinite 比 typeof any === 'number' 还要好? 我可以在相关行中使用 (expireHours || 1),但这是一场噩梦。用 typeof exireHours !== 'number' 替换 if 条件可以解决问题解决方案?的解决方法建议,希望对你解决我怎么能告诉 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 一切正常范围。添加另一个变量是唯一的方法吗?

解决方法

问题是您将参数标记为可选,因此编译器正确地抱怨它可能未定义。您可以通过以下三种方式之一“修复”此问题:

  1. 向编译器声明类型
  2. 给可选参数一个默认值
  3. 使用 user-defined type guard。

这样的类型保护看起来像这样

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,请注明来意。