簡體   English   中英

是否可以在TypeScript中組合用戶定義的類型保護?

[英]Is it possible to combine user defined type guards in TypeScript?

特定

type Maybe<T> = T | undefined;

class Obj {
    jbo: Maybe<Jbo>;
}

,是否可以定義一個給定o: Maybe<Obj>的函數o: Maybe<Obj>斷言oo.jbo的類型?

我想的是:

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

用戶定義的typeguard只能返回一個x is T 幸運的是,您可以在您選擇的T使用工會和交叉點。 所以,例如:

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

所述everythingIsDefined函數斷言,輸入既是 Obj (相對於未定義的), 一個對象,其jbo屬性是一個Jbo (相對於未定義)。 所以你可以像這樣使用它:

if (everythingIsDefined(obj)) {
  console.log(obj.jbo.toString()) // no error
} 

是的,你可以把它拉下來:

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是一種映射類型,您可以更好地控制如何創建類型保護。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM