Typescript &引用;对象可能未定义";检查后仍有错误

Typescript &引用;对象可能未定义";检查后仍有错误,typescript,strict,Typescript,Strict,访问length属性时出现错误。我知道我可以通过只检索一次对象,然后执行未定义-检查来解决问题。或者只需添加一个。但我想了解为什么会发生这种情况,并找出是否有更好的解决方案。下面是一个人为的例子: type MyMap<K extends string> = { [key in K]: string|undefined } const getValueLength = (tmp:MyMap<string>, key:string) => { return tm

访问
length
属性时出现错误。我知道我可以通过只检索一次对象,然后执行
未定义
-检查来解决问题。或者只需添加一个
。但我想了解为什么会发生这种情况,并找出是否有更好的解决方案。下面是一个人为的例子:

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

const getValueLength = (tmp:MyMap<string>, key:string) => {
  return tmp[key] !== undefined && tmp[key].length
}
type MyMap={[输入K]:字符串|未定义}
const getValueLength=(tmp:MyMap,key:string)=>{
返回tmp[key]!==未定义&&tmp[key]。长度
}
我正在严格模式下运行typescript 3.3


问题在于检查是在另一个函数中进行的,这不是这里的问题。

访问键被视为一个函数调用,它可能会改变您正在查看的对象/值,因此不能保证
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;
};
type MyMap={[key in K]:string | undefined};
const getValueLength=(tmp:MyMap,key:string)=>{
const str=tmp[key];
返回str!==未定义和str.length;
};

谢谢您的回答。您知道我在哪里可以了解更多关于为什么对象属性访问被解释为函数调用的信息吗?我正试图更深入地理解这个问题。