typescript - 消除未定义的警告?来自 Object.entries 遍历的值应该是保证字符串
问题描述
我已成功让我的代码编译并运行良好,但我的 Typescript 编辑器仍在Playground Linkval
的第 57 行报告警告
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)
...但我不知道它怎么可能是未定义的。
也许它警告我 Object 可能符合 SearchInvocation 类型的形状,但其他(非托管)键值对可能已添加到顶部,并且它们的内容是未知的。
但是,我没有从 ProxyInvocation 类型中遍历 Object.entries() 得到等效的警告,它看起来有些等效,但必须隐式保护。
如果非托管键是问题的根源,我不知道如何添加运行时防护,它将我正在遍历的键过滤为仅由 SearchInvocation 类型管理的键。我认为这将涉及在 javascript 运行时读取 SearchField 中列出的字符串文字的联合,以过滤掉其他文字。或者也许我可以对 SearchInvocation 类型施加进一步的限制,以从不接受不是来自 SearchField 的键。
解决方案
您的错误是因为 SearchInvocation 类型中的属性是可选的,因此,val
可能for of
未定义。
您可以使用非空断言运算符(我不喜欢使用它,因为对我来说就像使用任何)对 Typescript 说“我知道这个值永远不会是未定义的,不要在这里检查”
推荐阅读
- angular - Angular MatDialog 显示在页面底部
- java - Java 如何防止尚未分配的实例被垃圾回收?
- python-3.x - 如何在函数中使用单选按钮值?
- docker - docker中的upower在启动时让我出现奇怪的错误
- python - 当 Python “None or True”返回 True 时,为什么 pandas “None | True”返回 False?
- ruby-on-rails - json中没有附件路径,连接表
- ubuntu - Ubuntu 20.04 L2TP 连接问题
- r - 计算R中数据集错误中定义值的标准偏差
- c# - 使用数据模板禁用组合框
- c++ - 如果一个单词在一个字符串中重复多次,我如何计算单词的重复次数及其位置?