javascript - 覆盖 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
。
解决方案
您的 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>][];
}
推荐阅读
- go - Golang io.copy 不复制整个数据
- spring - Spring声明性事务按条件给事务管理器名称
- c# - 我是否需要在 ASP.NET Core 3.1 应用程序中添加对 Microsoft.Extensions.Hosting 包的引用?
- azure-devops - SPLA 计划下的 Azure DevOps Basic + 测试计划
- vb.net - VS 2019 Visual Basic导航栏类列表选择时不刷新
- kubernetes - 如何获取我的 K8S 集群的私钥
- java - 如何获取 id 的原始 id 到颜色算法?
- android - 我不明白为什么以及如何在 Fragment Android 中自动修复软键盘打开和关闭
- python - TypeError:不能将序列乘以“str”类型的非整数 - 将两列相乘后
- xamarin - Xamarin UITest REPL 树“无法连接”