首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为Object.entries定义一个不包含未定义值的Typescript类型?

为Object.entries定义一个不包含未定义值的Typescript类型?
EN

Stack Overflow用户
提问于 2021-07-16 14:01:48
回答 1查看 177关注 0票数 1

我有一个Object.entries类型,如下所示:

代码语言:javascript
运行
复制
type _ObjectEntries<T extends Record<string, any>> = {
  [K in keyof T]: [K, T[K]];
}[keyof T][];

function objectEntries<T extends Record<string, any>>(
  obj: T,
): _ObjectEntries<{
  [K in keyof T]-?: T[K]
}> {
  return Object.entries(obj);
}

当我知道物体的确切形状时,这很有效,例如:

代码语言:javascript
运行
复制
const obj1: { a: number, b?: number } = { a: 1, b: 2 };
const entry1 = objectEntries(obj1)[0]; // ["a", number] | ["b", number]

尽管b是可选的,但它仍然有效。

但是,如果我不知道对象的确切形状(即它具有任意关键点),这会将undefined添加到值中:

代码语言:javascript
运行
复制
const obj2: Partial<Record<string, number>> = { a: 1, b: 2 };
const entry2 = objectEntries(obj2)[0]; // [string, number | undefined]

TS Playground

我希望类型是[string, number]

我认为问题出在Partial<Record<string, number>>。我认为这意味着“只要键存在,值就必须是一个数字”。然而,TS似乎将其解释为“对于任何键,值必须是数字或未定义的”。

我知道区分optional keys和undefined有很多问题。但是,特别是对于Object.entries,有没有可行的变通方法?我考虑标记对象,以了解它们是否可以具有undefined值,但这似乎太老生常谈了。

EN

回答 1

Stack Overflow用户

发布于 2021-07-16 14:19:48

也许您可以使用NonNullable<T>,它排除了undefinednull,或者如果您只想排除undefined,也可以使用Exclude<T, undefined>

代码语言:javascript
运行
复制
function objectEntries<T extends Record<string, any>>(
  obj: T,
): _ObjectEntries<{
  [K in keyof T]-?: NonNullable<T[K]>
}> {
  return Object.entries(obj);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68404128

复制
相关文章

相似问题

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