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
    第一种类型是带有字符串键的记录
  • K扩展T的键
    表示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);