【问题标题】:Overriding Object.entries()'s types causes an unexpected error覆盖 Object.entries() 的类型会导致意外错误
【发布时间】:2021-06-16 11:04:45
【问题描述】:

我这样覆盖Object.entries

interface ObjectConstructor {
  entries<T extends Record<string, any>>(o: T): {
      [K in keyof T]: [K, T[K]];
  }[keyof T][];
}

它通常可以正常工作。但是,在某些情况下,我会得到:

Type '["alignContent", AlignContent | undefined] | ["alignItems", AlignItems | undefined] | ["alignSelf", AlignSelf | undefined] | ... 781 more ... | undefined' must have a '[Symbol.iterator]()' method that returns an iterator.

联合中的最后一个类型是undefined,我无法像这样解构:

const style: Partial<React.CSSProperties> = {
  height: '123px',
};
for (const [k, v] of Object.entries(style)) {
  ...
}

根据类型定义,它永远不应该返回undefined。为什么返回undefined?我想省略undefined 是安全的。

【问题讨论】:

  • 请列出引发错误的案例
  • 我需要style 的样本数据。
  • 添加示例
  • 这绝对适用于 typescript 4.1.2。因此,要么您使用有问题的不同版本,要么您的价值观更可能与您混淆。
  • 我有4.3.2,可能是一个新的变化。这是类型错误,而不是值错误。

标签: javascript typescript


【解决方案1】:

您的 style 属性示例并不代表您的实际使用情况。提供的代码在 typescript 3.9 和 4.1(使用 React 16.x 和 17.x)中都可以正常工作。

回答你的问题:

根据类型定义,它永远不应该返回 undefined。为什么它返回未定义?我想省略 undefined 是安全的。

所以是的,这样做是安全的,如果您无法解决您使用的数据混乱的问题。

您的代码应该看起来像这样(尽管有不止一种方法可以实现)

interface ObjectConstructor {
  entries<T extends Record<string, any>>(o: T): {
    [K in keyof Omit<T, undefined>]: [K, T[K]];
  }[keyof Omit<T, undefined>][];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-21
    • 2012-04-20
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 2016-01-03
    • 2016-03-09
    • 1970-01-01
    相关资源
    最近更新 更多