如何在Typescript2中正确检查isDefined

时间:2018-08-30 10:47:56

标签: javascript typescript typescript-generics

我想创建一个函数来检查变量是否不是nullundefined

我要检查的是安全类型的变量。

在我的上一个项目中,我执行以下操作:

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

但是为什么它在我当前的项目中不起作用,可能是由于tsconfig不同-我在isDefined(foo)之后看到许多错误,例如“变量可能为null”(项目使用相同的打字稿版本-{ {1}})

我还看到了另一种可行的方法,但是...在术语或类型上有些奇怪。

"2.7.2"

问题:如何创建function isDefined(value: any): value is {} | string | number | boolean { return value !== undefined && value !== null; } 来保存变量类型?


UPD1 :用法示例:

const foo:字符串| undefined ='foo';

isDefined

1 个答案:

答案 0 :(得分:0)

好的,我找到了既可行又对类型友好的解决方案:

tl; dr

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

为什么?

通过这种方式,isDefined()将尊重变量的类型,并且以下代码将对此进行检查。

示例1 -基本检查:

function getFoo(foo: string): void { 
  //
}

function getBar(bar: string| undefined) {   
  getFoo(bar); //ERROR: "bar" can be undefined
  if (isDefined(bar)) {
    getFoo(bar); // Ok now, typescript knows that "bar' is defined
  }
}

示例2 -类型方面:

function getFoo(foo: string): void { 
  //
}

function getBar(bar: number | undefined) {
  getFoo(bar); // ERROR: "number | undefined" is not assignable to "string"
  if (isDefined(bar)) {
    getFoo(bar); // ERROR: "number" is not assignable to "string", but it's ok - we know it's number
  }
}