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

单独函数中“未定义”的自定义类型脚本类型保护

  •  2
  • lonix  · 技术社区  · 7 年前

    这不会编译:

    public hello(user?: User): void {
      // ...do some stuff
      console.log(user.toString());      // error: "Object is possibly undefined" 
    }
    

    if (!user) throw Error();
    

    但是我想把它转移到一个单独的函数中,所以我尝试了

    private guard(arg: unknown): arg is object {
      if (!arg) throw Error();
    }
    

    我试过了

    private guard(arg: unknown): arg is object {
     return arg !== undefined;
    }
    

    1 回复  |  直到 7 年前
        1
  •  8
  •   Krisztián Balla    5 年前

    您可以使用如下模板函数:

    function isDefined<T>(val: T | undefined | null): val is T {
        return val !== undefined && val !== null;
    }
    

    这一个检查是否有问题 undefined null .

        2
  •  1
  •   Titian Cernicova-Dragomir    7 年前

    您拥有的代码应该可以工作,包含的示例如下:

    type User = { a: string }
    function hello(user?: User): void {
      if (guard(user)) {
        console.log(user.toString());
      }
    }
    
    function guard(arg: unknown): arg is object {
      return arg !== undefined;
    }
    

    if 这在当前是不可能的,所有类型保护都需要某种形式的条件语句( switch )

        3
  •  1
  •   Mike Fogel    5 年前

    你可以使用lodash助手 already have type guards defined on them .

    import * as _ from 'lodash'
    type User = {a: string}
    function hello(user?: User): void {
      if (_.isObject(user)) {
        console.log(user.toString())
      }
    }
    
    推荐文章