首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Object.entries()时保留键类型

使用Object.entries()时保留键类型
EN

Stack Overflow用户
提问于 2021-08-11 13:03:11
回答 2查看 460关注 0票数 5

下面是我的问题的一个例子(在ts游乐场的演示)

代码语言:javascript
复制
type Tkey = 'foo' | 'bar' | 'defaultKey'

const typedObject: Record<Tkey, Boolean> = {
  'foo': true,
  'bar': false,
  'defaultKey': true
}

// type does not persist string narrowing
const entries = Object.entries(typedObject) // [string, Boolean][]

因此,key in [key, values]string型,而不是Tkey型。

作为一种解决办法,您可以在事后手动强制,但最好在操作期间定义类型。

代码语言:javascript
复制
const typedEntries = entries as [Tkey, Boolean][]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-11 13:48:52

TypeScript的本机定义文件包含Object.entries的以下内容

代码语言:javascript
复制
entries<T>(o: { [s: string]: T } | ArrayLike<T>): [string, T][];

entries(o: {}): [string, any][];

您获得所需行为的唯一机会是使用以下内容覆盖此定义:

代码语言:javascript
复制
interface YourOwnObject {
  entries<T>(o: { [K in keyof T]: T[K] }): [keyof T, T[keyof T]][];
}

(<YourOwnObject>Object).entries(typedObject).forEach(([key, values]) => {
  // ...
})
票数 1
EN

Stack Overflow用户

发布于 2021-11-11 00:13:40

您可以通过添加包含两个泛型类型参数的自己的对象定义来扩展默认类型记录库

在项目根目录中添加以下globals.d.ts文件:

代码语言:javascript
复制
interface ObjectConstructor {
    entries<TKey extends PropertyKey, TVal>(o: Record<TKey,TVal>): [TKey, TVal][];
    keys<TKey extends PropertyKey>(obj: Record<TKey,any>): TKey[];
}

然后像这样使用它:

代码语言:javascript
复制
const entries = Object.entries<ObjKeys, Boolean>(myObj) // [ObjKeys, Boolean][]
const keys = Object.keys<ObjKeys>(myObj) // ObjKeys[]

TS游乐场演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68742597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档