鉴于
type Maybe<T> = T | undefined;
class Obj {
jbo: Maybe<Jbo>;
}
,是否可以定义一个函数,给定o: Maybe<Obj>
断言o
和o.jbo
的类型?
我想的是:
function everythingIsDefined(o: Maybe<Obj>):o is Obj && o.jbo is Jbo {
// checks in here
}
答案 0 :(得分:7)
用户定义的typeguard只能返回一个4,8,12
。幸运的是,您可以在x is T
选择中使用联合和交叉。所以,例如:
T
function everythingIsDefined(o: Maybe<Obj>): o is Obj & {jbo: Jbo} {
return typeof o !== 'undefined' && typeof o.jbo !== 'undefined';
}
函数断言输入两者一个everythingIsDefined
(与未定义相反),和一个对象{{1 property是Obj
(与undefined相对)。所以你可以像这样使用它:
jbo
答案 1 :(得分:0)
是的,你可以解决这个问题:
type Maybe<T> = T | undefined;
type DeepMaybe<T> = { [K in keyof T]: Maybe<T[K]> };
class Obj {
jbo: Jbo;
}
function everythingIsDefined<T>(o: DeepMaybe<T>): o is T {
return false;
}
然后:
let obj: DeepMaybe<Obj> = {} as Obj;
if (everythingIsDefined(obj)) {
// type of obj.jbo is Jbo
} else {
// type of obj.jbo is Maybe<Jbo>
}
说明:
可能无法使用您提供的类型(即Obj.jbo: Maybe<Jbo>
)来完成此任务。
相反,类Obj
需要将其属性定义为实际类型,但如果您将变量键入DeepMaybe<Obj>
(或其他任何内容而不是Obj
),那么您将获得相同的内容。
现在存在差异,因为DeepMaybe
是一种映射类型,您可以更好地控制如何创建类型保护。