gpt4 book ai didi

Typescript键值关系保留Object.entries类型

转载 作者:行者123 更新时间:2023-12-03 15:02:26 25 4
gpt4 key购买 nike

由typescript提供的Object.entries的键入具有返回类型[string, T][],但是我正在寻找一种通用类型Entries<O>来表示该函数的返回值,该函数保留键和值之间的关系。

例如。当对象类型像

type Obj = {
a: number,
b: string,
c: number
}

我正在寻找一种 Entries<O>类型,当提供 Obj时会导致以下一种类型(或类似的类型):
(["a", number] | ["b", string] | ["c", number])[]
[["a", number], ["b", string], ["c", number]]
(["a" | "c", number] | ["b", string])[]

对于Object.entries( see here)的所有用例而言,这并不正确,这对我的特定情况而言没有问题。

尝试失败的解决方案:
type Entries<O> = [keyof O, O[keyof O]][]对此不起作用,因为它仅保留可能的键和值,而不能保留它们之间的关系,因为 Entries<Obj>["a" | "b" | "c", number | string]
type Entry<O, K extends keyof O> = [K, O[K]]
type Entries<O> = Entry<O, keyof O>[]

在这里, Entry的定义按预期工作,例如。 Entry<Obj, "a">["a", number],但是在第二行中以 keyof O作为第二类型变量的应用又导致了与第一次尝试相同的结果。

最佳答案

当您想将每个键与依赖于该键类型的某些东西配对时,请使用mapped type:

type Entries<T> = {
[K in keyof T]: [K, T[K]];
}[keyof T][];

type Test = Entries<Obj>;
// (["a", number] | ["b", string] | ["c", number])[]

第二个版本具有包含属性而不是并集的元组类型,很难构建。 it is possible to convert a union to a tuple,但您基本上不应该这样做。

第三个版本是可管理的,但是比第一个版本复杂一些:您需要 this answer中的 PickByValue

type Entries3<T> = {
[K in keyof T]: [keyof PickByValue<T, T[K]>, T[K]]
}[keyof T][];

type Test3 = Entries3<Obj>;
// (["a" | "c", number] | ["b", string])[]

Playground Link

关于Typescript键值关系保留Object.entries类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60141960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com