簡體   English   中英

打字稿 - 檢查對象上是否存在可選屬性后仍然錯誤

[英]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.

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