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

gen*_*gen 2 javascript types casting typescript

特定

type Maybe<T> = T | undefined;

class Obj {
    jbo: Maybe<Jbo>;
}
Run Code Online (Sandbox Code Playgroud)

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

我想的是:

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

jca*_*alz 7

用户定义的typeguard只能返回一个x is T.幸运的是,你可以选择使用工会和十字路口T.所以,例如:

function everythingIsDefined(o: Maybe<Obj>): o is Obj & {jbo: Jbo} {
    return typeof o !== 'undefined' && typeof o.jbo !== 'undefined';
}
Run Code Online (Sandbox Code Playgroud)

everythingIsDefined函数断言,输入是两个Obj(相对于未定义的),一个对象,其jbo属性是一个Jbo(相对于未定义).所以你可以像这样使用它:

if (everythingIsDefined(obj)) {
  console.log(obj.jbo.toString()) // no error
} 
Run Code Online (Sandbox Code Playgroud)