Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript TS类型:将键数组和值数组转换为对象_Typescript_Object - Fatal编程技术网

Typescript TS类型:将键数组和值数组转换为对象

Typescript TS类型:将键数组和值数组转换为对象,typescript,object,Typescript,Object,我正在尝试创建一个类型,该类型将两个列表作为输入: Keys: ["foo", "bar", "baz"] Values: [50, number, "abc"] 然后,输出由其键和值组成的以下对象: { foo: 50, bar: number, baz: "abc" } type UnionToIntersection=(T扩展对象?(k:T)=>void:neve

我正在尝试创建一个类型,该类型将两个列表作为输入:

Keys: ["foo", "bar", "baz"]
Values: [50, number, "abc"]
然后,输出由其键和值组成的以下对象:

{
    foo: 50,
    bar: number,
    baz: "abc"
}
type UnionToIntersection=(T扩展对象?(k:T)=>void:never)扩展(k:inferu)=>void?U:从来没有;
键入KeyValuePairsFromList<
键扩展数组,
值扩展数组
> = {
[键索引中的索引]:索引扩展了键的值
?[键[索引]、值[索引]]
:从不;
};
键入ObjectFromKeyValuePairs<
KV扩展阵列,
T={
[index in keyof KV]:KV[index]扩展了[string | number,any]
?记录
:从不;
}
>=联合接口;
类型ObjectFromKeyValueArrays<
键扩展数组,
值扩展数组
>=ObjectFromKeyValuePairs;
const myObj={}as ObjectFromKeyValueArrays<
[“foo”,“bar”],
[5,“酒吧”]
>;
类型foo=类型myObj.foo//5
type bar=typeof myObj.bar//string
我现在的做法是将数组转换为键/值对,然后将它们映射到具有单个键的对象的并集,并将其转换为交点以获得最终对象

有没有更好的方法来实现这一点?我做错了吗?

解决方案:


输入长度字符串)和(()=>字符串)
*&(()=>记录|记录|未定义)
*&(…项目:(记录|记录)[])=>编号)
* & ... 还有24个…&((searchElement:Record | Record,fromIndex?:number |未定义)=>布尔值)
*/
类型检查=ObjectFromKeyValueArrays<
[“foo”,“bar”],
[5,“酒吧”]
>; 
//不编译
常量myObj:ObjectFromKeyValueArray<
[“foo”,“bar”],
[5,“酒吧”]
> = {
傅:5,,
酒吧:“酒吧”
} 

请记住,如果您使用类型转换,则有50%的情况是您的smth错误。

您的示例无法编译。查看这一行
ObjectFromKeyValuePairs
只是一个想法(尽管我无法解决整个问题),使用
type ObjectFromKeyValueArrays
在键数组和值数组的长度之间提供了很好的耦合,可以消除一些情况。@yossarian船长我编辑了它。现在应该可以了。谢谢你的接受。我做了一个关于类型转换的小更新,我不认为反对类型转换的建议是一个好的建议。有时候,你只能用类型转换来做一些事情,而这种建议可能会让初学者远离工具箱中的一个完全有效的工具。好吧,我做了50%:)顺便说一句,我不认为@Tachemetry是初学者他可能不是,但这里所问问题的答案不仅仅针对询问他们的人。它们还被搜索引擎编入索引,并作为其他人寻找不同问题解决方案的参考。
type UnionToIntersection<T> = (T extends object ? (k: T) => void : never) extends (k: infer U) => void ? U : never;

type KeyValuePairsFromLists<
    Keys extends Array<string | number>,
    Values extends Array<any>
> = {
    [index in keyof Keys]: index extends keyof Values
        ? [Keys[index], Values[index]]
        : never;
};
type ObjectFromKeyValuePairs<
    KV extends Array<[string | number, any]>,
    T = {
        [index in keyof KV]: KV[index] extends [string | number, any]
            ? Record<KV[index][0], KV[index][1]>
            : never;
    }
> = UnionToIntersection<T[keyof T]>;

type ObjectFromKeyValueArrays<
    Keys extends Array<string | number>,
    Values extends Array<any>
> = ObjectFromKeyValuePairs<KeyValuePairsFromLists<Keys, Values>>;
const myObj = {} as ObjectFromKeyValueArrays<
    ["foo", "bar"],
    [5,     "bar"]
>;

type foo = typeof myObj.foo // 5
type bar = typeof myObj.bar // string