无法编译:
public hello(user?: User): void {
// ...do some stuff
console.log(user.toString()); // error: "Object is possibly undefined"
}
可以用类型保护程序来解决:
if (!user) throw Error();
但是我想将其移到一个单独的函数中,所以我尝试了
private guard(arg: unknown): arg is object {
if (!arg) throw Error();
}
我尝试了
private guard(arg: unknown): arg is object {
return arg !== undefined;
}
但这不起作用。
如何在单独的函数中编写自定义类型防护,以断言“不是未定义的”?
答案 0 :(得分:3)
您可以使用如下模板功能:
function hasValue<T>(obj: T | undefined | null): obj is T {
return (obj !== undefined && obj !== null);
}
此人检查的不是undefined
也不是null
。
答案 1 :(得分:1)
您拥有的代码应该可以工作,这个包含的示例按原样工作:
type User = { a: string }
function hello(user?: User): void {
if (guard(user)) {
console.log(user.toString());
}
}
function guard(arg: unknown): arg is object {
return arg !== undefined;
}
如果要查找的版本不需要当前不可能的if
,则所有类型防护都需要某种形式的条件语句(if
或switch
)>
答案 2 :(得分:1)
您可以使用 already have type guards defined on them 的 lodash 助手。
import * as _ from 'lodash'
type User = {a: string}
function hello(user?: User): void {
if (_.isObject(user)) {
console.log(user.toString())
}
}