开发者问题收集

Typescript 检查变量为 null 或未定义

2021-01-26
14609

抱歉,不确定如何描述我的问题。希望标题没有误导您。

首先,我的问题发生在启用了严格模式的 Angular 11 中。

假设我有一个数组

let results: T[] = [];

并且我有一个如下函数,并且该函数在 Visual Studio Code 中不会给出任何错误。

filter = (values: (T | null | undefined)[]): T[] => {
  for(let value of values) {
    if (value !== null && value !== undefined) {
      results.push(value);
    }
  }
}

但是,如果我将条件提取到另一个函数,例如

isNullOrUndefined = (value: T | null | undefined): bool => {
  return value === null || value === undefined;
}

然后在上面的 filter 函数中使用该函数,如下所示:

filter = (values: (T | null | undefined)[]): T[] => {
  for(let value of values) {
    if (!isNullOrUndefined(value)) {
      results.push(value);
    }
  }
}

我收到错误 类型为“Nullable<T>”的参数不能分配给类型为“T”的参数。

有人可以帮忙看看吗?谢谢

2个回答

问题在于 isNullOrUndefined 函数的类型。

当您使用这样的条件时

if (value !== null && value !== undefined) {
     results.push(value); // value is only T here

它被用作类型约束。Typescript 会自动将 if 分支中的值类型限制为 T

但是如果您使用返回 booleanisNullOrUndefined ,Typescript 不会检查函数的实际实现 - 即使您没有明确指定返回类型。

if (!isNullOrUndefined(value)) {
  results.push(value); // value still is T | null | undefined
}

为了使其工作,您还需要将 isNullOrUndefined 键入为类型约束,方法是将返回类型指定为 value is null | undefined

isNullOrUndefined = (value: T | null | undefined): value is null | undefined => {
  return value === null || value === undefined;
}

然后 Typescript 的行为将与原始版本相同。

if (!isNullOrUndefined(value)) {
  results.push(value); // value is T
}
kvetis
2021-01-26

一种简便的方法是

let show = !input ? false : true;

let input = null;
let show = !input ? false : true;
console.log("show: " + input + " --> " + show);

input = undefined;
show = !input ? false : true;
console.log("show: " + input + " --> "  + show);

input = false;
show = !input ? false : true;
console.log("show: " + input + " --> "  + show);

input= true;
show = !input ? false : true;
console.log("show: " + input + " --> "  + show);

返回

show: null --> false
show: undefined --> false
show: false --> false
show: true --> true
Werner Diwischek
2023-01-04