自定义TypeScript类型保护,用于单独函数中的“未定义”

时间:2019-02-17 17:56:43

标签: typescript

无法编译:

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;
}

但这不起作用。

如何在单独的函数中编写自定义类型防护,以断言“不是未定义的”?

3 个答案:

答案 0 :(得分:3)

您可以使用如下模板功能:

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

此人检查的不是undefined也不是null

答案 1 :(得分:1)

您拥有的代码应该可以工作,这个包含的示例按原样工作:

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,则所有类型防护都需要某种形式的条件语句(ifswitch

答案 2 :(得分:1)

您可以使用 already have type guards defined on them 的 lodash 助手。

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