Typescript,将一个对象映射到另一个对象?
我有两个对象,我的自定义映射函数用于将一个对象的道具映射为另一个对象的值,例如:Typescript,将一个对象映射到另一个对象?,typescript,Typescript,我有两个对象,我的自定义映射函数用于将一个对象的道具映射为另一个对象的值,例如: const obj1={ 主机:'clientNameHost', pass:'clientNamePass', }; 常数obj2={ clientNamePass:'12345', clientNameHost:'http://localhost:3000', }; 常量mapParams=(源:T,参数:K)=>Object.entries(参数) .reduce((acc[param,sourceProp]
const obj1={
主机:'clientNameHost',
pass:'clientNamePass',
};
常数obj2={
clientNamePass:'12345',
clientNameHost:'http://localhost:3000',
};
常量mapParams=(源:T,参数:K)=>Object.entries(参数)
.reduce((acc[param,sourceProp])=>({…acc[param]:source[sourceProp]}),{});
mapParams(obj2,obj1)//{主机:http://localhost:3000,通过:“12345”}
我很难输入这个函数。是否有某种方法可以正确键入mapParams函数?解决方案是缩小泛型类型的范围,以便在两个参数中显示键和值之间的关系:
const obj1 = {
host: 'clientNameHost',
pass: 'clientNamePass',
} as const;
const obj2 = {
clientNamePass: '12345',
clientNameHost: 'http://localhost:3000',
} as const;
const mapParams = <T extends Record<string, any>, K extends keyof T, P extends Record<T[K], any>>(source: T, params: P) => Object.entries(params)
.reduce((acc, [param, value]) => ({ ...acc, [param]: source[value as T[K]] }), {});
console.log(mapParams(obj1, obj2)) //{host: "http://localhost:3000", pass: "12345"}
const obj1={
主机:'clientNameHost',
pass:'clientNamePass',
}作为常量;
常数obj2={
clientNamePass:'12345',
clientNameHost:'http://localhost:3000',
}作为常量;
常量mapParams=(源:T,参数:P)=>Object.entries(参数)
.reduce((acc[param,value])=>({…acc[param]:source[value as T[K]]}),{});
console.log(mapParams(obj1,obj2))/{host:http://localhost:3000,通过:“12345”}
关键部分:
第一种类型是带有字符串键的记录T extends Record
表示T的键K扩展T的键
关键部分-我们希望对象在P扩展记录
T
- 添加了“
,以便正确推断缩小的类型as const”
请注意,很抱歉恢复了参数顺序 键入函数时,我最关心的是参数和返回类型 您可以按如下方式键入参数:
<InputProps, TargetProps extends Record<keyof TargetProps, keyof InputProps>>(
source: InputProps,
params: TargetProps
) => ...
你可以试试。你可以这样写
sourceProp作为keyof T
:const-mapParams=(source:T,params:K)=>Object.entries(params).reduce((acc,[param,sourceProp])=>({…acc,[param]:source[sourceProp作为keyof T],{})代码>
type MapFrom<A, B> = Record<keyof A, B[keyof B]>;
type MapFrom<A, B> = Record<keyof A, B[keyof B]>;
const obj1 = {
host: "clientNameHost",
pass: "clientNamePass"
} as const;
const obj2 = {
clientNamePass: "12345",
clientNameHost: "http://localhost:3000"
} as const;
const mapParams = <InputProps, TargetProps extends Record<keyof TargetProps, keyof InputProps>>(
source: InputProps,
params: TargetProps
) =>
Object.entries<keyof InputProps>(params).reduce(
(acc, [param, sourceProp]) => ({
...acc,
[param]: source[sourceProp]
}),
{} as MapFrom<TargetProps, InputProps>
);
const obj3 = mapParams(obj2, obj1);