如何在 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 【问题描述】:我想创建一个函数来检查变量是否不是null
或undefined
。
我想要的是检查后变量的安全类型。
在我的上一个项目中,我这样做了:
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 数字上的 null 和空字符串的最简单方法