具有strictNullChecks的TypeScript和检测空值的函数

时间:2019-08-20 10:31:30

标签: typescript

由于Javascript的性质,我一直都在检查值是否为!= null && != '',所以我创建了一个函数来检查值是否为空,如下所示:

const isEmpty = (variable: any, allowEmptyString?: boolean): boolean => {
    return variable == null || (variable == '' && !allowEmptyString);
};

问题是,其他方法不知道这意味着什么,因此我必须一直使用!来防止警告,例如:

const foo = (val?: number): void => {
    let a = 0;

    if (!isEmpty(val)) {
        a = val;
        // let a: number;
        // Type 'number | undefined' is not assignable to type 'number'.
        // Type 'undefined' is not assignable to type 'number'
    }
};

我当前的解决方案是:

if (!isEmpty(val)) {
    a = val!
}

是否有避免使用!来防止警告的方法?

1 个答案:

答案 0 :(得分:6)

这是一个解决方案:

function isEmpty(variable: string | null | undefined, allowEmptyString?: boolean): variable is Exclude<undefined | null, string>
function isEmpty<T>(variable: T | null | undefined): variable is Exclude<undefined | null, T>
function isEmpty(variable: any, allowEmptyString = false): boolean {
    return variable === null 
        || variable === undefined 
        || (variable === '' && !allowEmptyString);
}

注意:

  • 使用===代替==
  • 照顾undefined值;
  • 默认情况下(没有将参数allowEmptyString设置为true的情况下,空字符串将作为undefinednull处理,并且编译器会错误地认为它不是字符串。
  • 颠倒Exclude的参数是为了模拟布尔值的“ not”(它可以工作,但是我不确定为什么)。

…或exists函数

但是我建议使用exists函数以避免双重反转。它更容易编写,更易于使用:

function exists(variable: string | null | undefined, allowEmptyString?: boolean): variable is string
function exists<T>(variable: T): variable is NonNullable<T>
function exists(variable: any, allowEmptyString = false): boolean {
    return variable !== null 
        && variable !== undefined 
        && (variable !== '' || allowEmptyString);
}