是否可以在TypeScript中组合用户定义的类型保护?

时间:2017-07-27 16:50:55

标签: javascript typescript types casting

鉴于

type Maybe<T> = T | undefined;

class Obj {
    jbo: Maybe<Jbo>;
}

,是否可以定义一个函数,给定o: Maybe<Obj>断言oo.jbo的类型?

我想的是:

function everythingIsDefined(o: Maybe<Obj>):o is Obj && o.jbo is Jbo {
    // checks in here
}

2 个答案:

答案 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>
}

code in playground

说明:
可能无法使用您提供的类型(即Obj.jbo: Maybe<Jbo>)来完成此任务。
相反,类Obj需要将其属性定义为实际类型,但如果您将变量键入DeepMaybe<Obj>(或其他任何内容而不是Obj),那么您将获得相同的内容。

现在存在差异,因为DeepMaybe是一种映射类型,您可以更好地控制如何创建类型保护。