字典上出现奇怪的错误“对象可能是'未定义'的”

时间:2019-09-26 09:14:09

标签: typescript

在以下代码中,为什么stopsDict["first"].directions.push("test");行通过了检查,但没有通过stopsDict[stopName].directions.push("test");行呢?

interface StopsDict {
  [key: string]: Stops;
}

interface Stops {
  directions?: string[];
}

let stopsDict: StopsDict = { 
  first: {
    directions: []
  },
  second: {}
};

if (Array.isArray(stopsDict["first"].directions)) {
  stopsDict["first"].directions.push("test"); //OK
}

let stopName = "first";
if (Array.isArray(stopsDict[stopName].directions)) {
  stopsDict[stopName].directions.push("test"); //error TS2532: Object is possibly 'undefined'.
}

1 个答案:

答案 0 :(得分:-1)

因为从理论上讲stopsDict[name].directions可以是null。您可以告诉TS自己了解得更多,如果不是,则承担所有责任:

stopsDict[name].directions!.push("test")

对于一个非玩具示例,您想引入确保满足前提条件的检查,而不是通过类型检查器进行强力检查。

查看更多in docs

具体来说,这不会引发错误:

let dirs = stopsDict[stopName].directions;
if (Array.isArray(dirs)) {
  dirs.push("test");
}