【问题标题】:Condition to check that an array of variables is defined检查变量数组是否已定义的条件
【发布时间】:2022-02-12 00:40:53
【问题描述】:

假设我想验证一个变量既不是空值也不是未定义的。

我真的会这样做:

let foo: string | undefined | null;

if (foo !== undefined && foo !== null) {
  // foo is a string
}

现在,我想创建一个可以同时对多个变量进行相同检查的函数。

我试过了:

const isSet = <T>(...values: T[]): values is Exclude<T, null | undefined>[] => {
  return values.every(value => value !== undefined && value !== null)
};

但是,我收到一个 Typescript 错误 “类型谓词无法引用其余参数”,这是有道理的。

你有什么建议?

【问题讨论】:

  • 这个函数的返回类型不应该是“boolean”吗?
  • @8ns,确实如此;这称为类型保护
  • 谢谢@Connor Low 我会去看看!

标签: typescript


【解决方案1】:

您不能针对多个参数编写类型保护。我会将您的策略​​更改为这样的:

function isSet<T,>(...values: T[]) : null | NonNullable<T>[] {
    return values.every(value => value !== undefined && value !== null) 
        ? values as NonNullable<T>[] 
        : null;
}

这是一个编译器不够聪明的例子,无法断言values 的类型,所以你必须给它一点as NonNullable&lt;T&gt;[] 的帮助。与其返回布尔值(或类型保护),不如返回您刚刚的值 已验证。

用法如下:

let a = null, b = undefined, c = 0;

// guarded: null | number[];
let guarded = isSet(a, b, c);

if (guarded) {
  // guarded: number[]
  let [x, y, z] = guarded;
}

Playground

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2022-12-03
    • 2010-09-22
    • 2018-09-09
    • 2022-01-08
    相关资源
    最近更新 更多