代码之家  ›  专栏  ›  技术社区  ›  machineghost

如何处理可能为空的变量。。。我知道的不是零?

  •  1
  • machineghost  · 技术社区  · 2 年前

    如果我正在使用(严格的null检查)TypeScript,并且我有一些可能带有null变量的代码:

    let x = null;
    if (someCondition) {
      x = { a: 1 };
    }
    
    doSomethingWith(x.a);
    

    正如预期的那样,我得到了一个错误:

    “x”可能为“null”。

    我可以用 null 检查:

    if (!x) return;
    doSomethingWith(x.a);
    

    但后来我得到:

    类型“never”上不存在属性“a”。

    实际上 if / return ,我想写的是 assert 呼叫:

    const assert = value => { if (!value) throw Error(); }
    
    assert(x);
    doSomethingWith(x.a);
    

    ……但这甚至不能消除第一个错误。

    我发现我可以用以下方法修复第二个错误:

    (rootGroup as {id: number}).id
    

    但我不确定这是否是最简单的解决方案,而且它仍然不能解决使用 明确肯定 作用

    我的问题是,我怎么能。。。?

    1. 创建一个“可能为null”的变量
    2. 运行一个函数来证明它不是null(如果是null,则抛出一个错误)
    3. 添加(尽可能少的)TypeScript代码,然后
    4. 使用该变量,不会出现任何TS错误
    1 回复  |  直到 2 年前
        1
  •  2
  •   brc-dd    2 年前

    您可以使用 assertion signatures 像这样:

    let x: { a: 1 } | null = null
    
    if (someCondition) {
      x = { a: 1 }
    }
    
    // @ts-expect-error x maybe null
    console.log(x.a)
    
    assert(x) // asserting that x is truthy
    
    console.log(x.a) // no error here
    
    function assert(value: unknown): asserts value {
      if (!value) {
        throw new Error('foo')
      }
    }
    

    如果你只想抛出无效值,你可以这样做:

    function assertNotNull<T>(value: T): asserts value is NonNullable<T> {
      if (value == null) {
        throw new Error('bar')
      }
    }
    

    Playground

    推荐文章