类型缩小不适用于对象

时间:2019-03-08 09:38:49

标签: typescript

interface Obj {
  foo?: string;
  bar?: string;
}

const fn = (obj: Obj, key: keyof Obj) => {
  if (obj.foo) {
    const val1 = obj.foo; // string
  }

  if (obj['foo']) {
    const val2 = obj['foo'] // string
  }

  const picked = obj[key];

  if (picked) {
    const val3 = picked; // string
  }

  if (obj[key]) {
    const val4 = obj[key]; // string | undefined
  }
};

我想知道为什么在val4的情况下缩小类型不会起作用。

我知道我可以使用!或自定义定义的类型防护answered here。但是我想知道的是原因。

1 个答案:

答案 0 :(得分:0)

在对对象的动态访问(使用[]和变量作为索引的访问)上,导航不起作用。此限制是由于性能原因。您可以在GitHub上搜索有关此问题,here是其中一个。