我想创建一个函数来检查变量是否不是null
或undefined
。
我要检查的是安全类型的变量。
在我的上一个项目中,我执行以下操作:
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
答案 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
}
}