首页 > 解决方案 > 覆盖 Object.entries() 的类型会导致意外错误

问题描述

我这样覆盖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

标签: javascripttypescript

解决方案


您的 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>][];
}

推荐阅读