如何在 Typescript 中检查 null 和 undefined 并保存类型信息?

Posted

技术标签:

【中文标题】如何在 Typescript 中检查 null 和 undefined 并保存类型信息?【英文标题】:How to check null and undefined in Typescript and save the type info? 【发布时间】: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;

【问题讨论】:

你能粘贴一个给你错误的行吗? Maybe answer from this question can help you ? 【参考方案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)

【讨论】:

以上是关于如何在 Typescript 中检查 null 和 undefined 并保存类型信息?的主要内容,如果未能解决你的问题,请参考以下文章

TypeScript 2.0开启空值的严格检查

检查 TypeScript 数字上的 null 和空字符串的最简单方法

TypeScript 是不是有 Null 条件运算符

使用 Typescript 不允许 React createContext(null)?

微软编程语言 TypeScript 2.0 发布

TypeScript:如何在 0.8.0.0 之后的版本中将 null 传递给重载函数?