首页 > 解决方案 > 即使在检查后也出现“对象可能未定义”错误

问题描述

访问该length属性时出现错误。我知道我可以通过只检索一次对象然后执行undefined-check 来解决问题。或者简单地添加一个!. 但我想了解为什么会发生这种情况,并找出是否有更好的解决方案。这是人为的示例:

type MyMap<K extends string> = { [key in K]: string|undefined }

const getValueLength = (tmp:MyMap<string>, key:string) => {
  return tmp[key] !== undefined && tmp[key].length
}

我在严格模式下运行 typescript 3.3。

这是一个类似的问题,问题是在另一个函数内部进行了检查,这不是这里的问题。

标签: typescriptstrict

解决方案


访问密钥被视为一个函数调用,它可能会改变您正在查看的对象/值,因此不能保证第一次和第二次调用tmp[key]会找到相同的东西。

为避免这种情况,请确保您只调用一次:

type MyMap<K extends string> = { [key in K]: string | undefined };

const getValueLength = (tmp: MyMap<string>, key: string) => {
  const str = tmp[key];
  return str !== undefined && str.length;
};

推荐阅读