[英]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>
斷言o
和o.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.