【问题标题】:How to check null and undefined in Typescript and save the type info?如何在 Typescript 中检查 null 和 undefined 并保存类型信息?
【发布时间】:2019-02-05 06:54:48
【问题描述】:

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

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

在我的上一个项目中,我这样做了:

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

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

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

function isDefined(value: any): value is {} | string | number | boolean {
  return value !== undefined && value !== null;
}

问题:如何创建isDefined来保存变量的类型?


UPD1:使用示例:

const foo: 字符串 |未定义 = 'foo';

function getFoo(foo: String): void { 
  console.log(foo);
}

function getBar(foo: string | undefined) {
  if (isDefined(foo)) {
    getFoo(foo); // getFoo still think that foo maight be undefined
  }
}

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

【问题讨论】:

标签: javascript typescript typescript-generics


【解决方案1】:

好的,我找到了可行且对类型足够友好的解决方案:

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

【讨论】:

    【解决方案2】:

    我知道这篇文章有点老了,但现在我认为你可以简单地写一些类似的东西

    /**
     * Generic type definition that describes a 'not undefined' type.
     */
    type Defined<T> = T extends undefined ? never : T
    
    /**
     * Generic type guard function for values runtime-checked as defined.
     *
     * @param argument - The argument to check.
     *
     * @returns The boolean describing the assertion.
     * @remarks Uses the {@link Defined} type as returned value.
     */
    function isDefined<T>(argument: T): argument is Defined<T> {
      return !!argument
    }
    
    const foo: string | undefined
    isDefined(foo)
          ? foo //string
          : foo //undefined (not string | undefined anymore)
    

    【讨论】:

      猜你喜欢
      • 2022-11-17
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      相关资源
      最近更新 更多