问题描述
我已经成功地完成了代码的编译和正常运行,但是我的Typescript编辑器仍在Playground Link的第57行中报告val
的警告
for (const [key,val] of Object.entries(searchInvocation)) {
encodedParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`);
}
我无法理解如何消除警告。谁能看到一个明显的变化,该变化会导致所需的缩小?
根据这种类型规范,我认为从searchInvocation重构的key
和val
必须分别是SearchField和字符串...
type SearchField = "q" | "sitename" | "filetype";
type SearchInvocation = {
[K in SearchField]?: string
}
错误报告为...
const val: string | undefined
Argument of type 'string | undefined' is not assignable to parameter of type 'string | number | boolean'.
Type 'undefined' is not assignable to type 'string | number | boolean'.ts(2345)
...但是我不知道它怎么可能不确定。
也许这是警告我,该对象可能符合SearchInvocation类型的形状,但其他(非托管)键值对可能已经添加在顶部,并且它们的内容是未知的。
但是,从ProxyInvocation类型遍历Object.entries()时,我没有收到等效警告,该警告看上去有些等效,但必须进行隐式保护。
如果非托管密钥是问题的根源,我不知道如何添加运行时保护措施,以将我遍历的密钥仅过滤到由SearchInvocation类型管理的密钥。我认为这将涉及在javascript运行时阅读SearchField中列出的字符串文字的并集,以过滤掉其他字符串。或者,也许我可以对SearchInvocation类型施加进一步的限制,以永远不接受不是来自SearchField的键。
解决方法
您的错误是因为SearchInvocation类型的属性是可选的,因此,val
中的for of
可能是未定义的。
您可以使用Non-null断言运算符(我不喜欢使用它,因为对我来说就像使用any一样)对Typescript说:“我知道这个值永远不会被定义,请不要在此处检查“