呀,你可以拉其關閉:
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
是一種映射類型,您可以更好地控制如何創建類型警衛。
很好的交點 –
這真棒,謝謝! – gen