![](/img/trans.png)
[英]How to tell TypeScript that optional property in object exists and is set?
[英]Typescript - after checking if optional property exists on object still errors
考慮以下示例( 操場):
type T = {
prop?: string;
};
const logObjProp = (obj: T & { prop: string }) => {
console.log(obj.prop);
};
const logObjWithProp = (obj: T) => {
if (obj.prop) {
const { prop } = obj; // string
logObjProp(obj); // Type 'string | undefined' is not assignable to type 'string'.
}
};
我期望在 if 塊中, obj
的類型從T
變為T & { prop: string }
,因為我們檢查了prop
存在。 但事實並非如此。 為什么?
(請不要陷入“為什么不直接通過prop
”之類的示例中。這沒有意義,只是為了以最短的方式演示問題。)
問題是縮小非歧視性內部屬性類型不會改變或縮小父類型。 T
不是 typescript 可以縮小的聯合類型。 您可以使用as
或自定義類型保護來更改類型:
const logObjWithProp = (obj: T) => {
if (obj.prop) {
logObjProp(obj as Required<T>);
// or logObjProp({ prop: obj.prop });
}
};
或者用prop
定義你的T
類型作為判別屬性,如下所示:
type T =
| { prop: unknown }
| { prop?: never };
...
const logObjWithProp = (obj: T) => {
if (obj.prop) {
logObjProp(obj); // works as expected
}
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.