消除未定义的警告?来自Object.entries遍历的值应保证为字符串

问题描述

我已经成功地完成了代码的编译和正常运行,但是我的Typescript编辑器仍在Playground Link的第57行中报告val的警告

    for (const [key,val] of Object.entries(searchInvocation)) {
      encodedParams.push(`${encodeURIComponent(key)}=${encodeURIComponent(val)}`);
    }

我无法理解如何消除警告。谁能看到一个明显的变化,该变化会导致所需的缩小?

根据这种类型规范,我认为从searchInvocation重构的keyval必须分别是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说:“我知道这个值永远不会被定义,请不要在此处检查“

关于此运算符https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-0.html#non-null-assertion-operator

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...