有人知道如何在只有部分键是已知/相关且其中一个已知键是可选的情况下键入转换函数吗?例如
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”类型中为必填项。
答案 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
| IHaveLineData
至IDoNotHaveLineData
,因为返回值只是更宽的类型。假设您想将IHaveLineData
的smth分配给string | number
,因为同样的原因,您不能这样做。
为确保获得所需的结构,您需要附加其他控制流以确保类型。因此:
number