首页 > 解决方案 > 消除未定义的警告?来自 Object.entries 遍历的值应该是保证字符串

问题描述

我已成功让我的代码编译并运行良好,但我的 Typescript 编辑器仍在Playground Linkval的第 57 行报告警告

    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)

...但我不知道它怎么可能是未定义的。

也许它警告我 Object 可能符合 SearchInvocation 类型的形状,但其他(非托管)键值对可能已添加到顶部,并且它们的内容是未知的。

但是,我没有从 ProxyInvocation 类型中遍历 Object.entries() 得到等效的警告,它看起来有些等效,但必须隐式保护。

如果非托管键是问题的根源,我不知道如何添加运行时防护,它将我正在遍历的键过滤为仅由 SearchInvocation 类型管理的键。我认为这将涉及在 javascript 运行时读取 SearchField 中列出的字符串文字的联合,以过滤掉其他文字。或者也许我可以对 SearchInvocation 类型施加进一步的限制,以从不接受不是来自 SearchField 的键。

标签: typescriptobjectundefinedtraversaltypeguards

解决方案


您的错误是因为 SearchInvocation 类型中的属性是可选的,因此,val可能for of未定义。

您可以使用非空断言运算符(我不喜欢使用它,因为对我来说就像使用任何)对 Typescript 说“我知道这个值永远不会是未定义的,不要在这里检查”

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


推荐阅读