在下面的例子中,Typescript一直警告obj?.[type]
隐式地具有any类型。我希望回调能够是未定义的或一个函数,因为我之后检查它。我希望保持对象是动态的,而不是显式地提供它的类型。我如何告诉typescript允许这个可选的链接语句传递而不发出警告消息?
const obj = {
row: {
over: {
page: () => { },
},
},
col: {
over: {
page: () => { }
}
},
el: {
over: {
page: () => { },
row: () => { },
}
}
};
function myFn(type: "page" | "row" | "col" | "el") {
const callback = obj?.[type]?.over?.[type];
if (callback) {
console.log("has callback");
}
console.log("no callback");
}
Typescript Playground: link
根本原因与可选链接无关。obj
在第一级不包含page
,因此会引起此警告。您应该像这样定义obj
的类型:
const obj: Record<string, { over: Record<string, () => void> }> = {
// ...
};
,它应该工作。
您可以在文件开头添加以下注释以避免类型检查:
// @ts-nocheck
但是你也会因为缺少属性而得到错误