如何键入一个函数来转换输入对象的某些属性

时间:2019-11-28 11:03:20

标签: typescript typescript-typings typescript-generics

有人知道如何在只有部分键是已知/相关且其中一个已知键是可选的情况下键入转换函数吗?例如

const transform = <T extends BaseAkpiDto>(akpiDTO: T) => {
  const { startDate, periodData, ...akpiBase } = akpiDTO;
  const withMoments = {
    ...akpiBase,
    startDate: moment.utc(startDate),
  };

  if (!periodData) {
    return withMoments;
  }

  return {
    ...withMoments,
    lineData: akpiDtoToLineData(withMoments.startDate, periodData),
  };
};

interface BaseAkpiDto {
  startDate: string;
  endDate: string;
  periodData?: PeriodDto[];
}

const test: WithPeriodData = akpiDTOtoAkpiData({
  id: 1,
  name: 'my name',
  startDate: '2019',
  periodData: [] as PeriodDto[],
});

interface WithPeriodData {
  id: number;
  name: string;
  startDate: Moment;
  lineData: Period[];
}

当(且仅)在输入:(

上有lineData属性时,我无法获得包含lineData属性的返回类型。

Typescript用以下消息向我的test变量投诉:

  

类型'Pick <{id:number;中缺少属性'lineData'名称:   串; startDate:字符串; periodData:PeriodDto [];   },“ id” | “ name”>&{startDate:Moment; endDate:片刻; }'但   “ WithPeriodData”类型中为必填项。

1 个答案:

答案 0 :(得分:0)

函数select name,population,area from world where (case when population>25000000 then 1 else 0 end)+ (case when area>3000000 then 1 else 0 end)=1 具有条件行为。查看控制流,它可以返回或对象是否包含transform。因此,您不能分配作为联合lineData | IHaveLineDataIDoNotHaveLineData,因为返回值只是更宽的类型。假设您想将IHaveLineData的smth分配给string | number,因为同样的原因,您不能这样做。

为确保获得所需的结构,您需要附加其他控制流以确保类型。因此:

number