在以下代码中,为什么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'.
}
答案 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");
}