gpt4 book ai didi

typescript - 如何合并接口(interface)的所有值

转载 作者:搜寻专家 更新时间:2023-10-30 20:56:45 24 4
gpt4 key购买 nike

我正在尝试合并接口(interface)的所有值,例如:

interface IA {
a: string;
}
interface IB {
b: string;
}
interface IC {
c: string;
}
//...

interface IMap {
"a": IA;
"b": IB;
"c": IC;
//...
"z": IZ;
}

有没有办法创建这样的类型:

type IAll = IMap["a"] & IMap["b"] & IMap["c"] & ... & IMap["z"];

我正在尝试同时使用这两个:

type valueMerge<T> = T[keyof T];
type valueMerge2<T extends keyof IMap = keyof IMap> = IMap[T];

// using
let t: valueof<IMap> = null as any;
let t2: valueof2 = null as any;

但是对于每一个,类型都是 IA | IB |集成电路 | ... | IZ 而不是 IA & IB & IC & ... & IZ

最佳答案

这类似于关于 how to programmatically turn a union into an intersection 的问题, 它有类似的解决方案。

通常当您执行 lookup of all the properties of an object type 时,如您所见,您将获得所有属性的联合。问题是 keyof T 是属性键的并集,查找键的并集会得到属性的并集,因为属性查找是协变的 在属性键类型中...但是您想要的是在属性键类型中逆变 操作。 (您可以阅读有关协方差/逆变的更多信息 here ,但基本上协方差意味着并集输入成为并集输出,而逆变意味着并集输入成为交集输出)。

幸运的是function arguments are contravariant ,所以如果我们可以将您的接口(interface)映射到一个新的接口(interface),其中旧的属性类型是函数参数,我们就可以到达一个地方,这些函数类型的联合可以导致它们的参数的交集。和 type inference in conditional types using the infer keyword可以为我们做到这一点(请参阅“如果从逆变位置推断出任何候选项,则推断的类型是这些候选项的交集”这一行)。

代码如下:

type IntersectProperties<T> = { [K in keyof T]: (x: T[K]) => void } extends {
[K in keyof T]: (k: infer I) => void
}
? I
: never;

T 的属性映射到函数参数,然后我们推断一个类型I 对应于所有 函数参数,这将是一个交集。

让我们看看它是否有效:

type IAll = IntersectProperties<IMap>;
// type IAll = IA & IB & IC & ... & IZ

看起来不错。希望有所帮助;祝你好运!

Link to code

关于typescript - 如何合并接口(interface)的所有值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57683609/

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