網站搜尋

typescript - 如何正確縮小 `unknown` 類型


摘要:為什麼

const func = (a: unknown) => {
  if (a && typeof a === 'object' && 'b' in a) {
    a.b;
  }
};

給出以下錯誤訊息

Property 'b' does not exist on type 'object'.

?

編輯:在更仔細地研究這個問題後,我有了一個更簡化的範例。所以讓我重新表達我的問題:

如何在 TypeScript 中正確縮小 object 類型?

摘要:為什麼

const func = (a: object) => {
  if ('b' in a) {
    a.b;
  }

顯示以下錯誤訊息:

Property 'b' does not exist on type 'object'.

?

答案#1

你應該更仔細地看看自訂型別保護。它們基本上讓編譯器知道,如果條件成立,被檢查的值將具有特定的型別。

在你的情況下:

  1. 定義自訂型別保護
const hasB = (value: unknown): value is { b: unknown } => {
  return (
    typeof value === 'object'
    && value !== null
    && 'b' in value
  );
}
  1. 用它檢查你的數值
const func = (a: unknown) => {
  if (hasB(a)) {
    a.b;
  }
};

遊樂場範例