有一种情况是,在将参数传递给函数时,我已经知道返回类型,但我很难向TypeScrip解释这一点.
export enum DatePreset {
Today = "Today",
ThisMonth = "This month",
ThisYear = "This year",
Custom = "Custom"
}
export interface DateRange {
from: Date;
to?: Date;
}
export interface DateRangeWithPreset extends DateRange {
preset: DatePreset;
}
export function applyPreset<T extends DatePreset = DatePreset>(
preset: T
): T extends DatePreset.Custom ? undefined : Required<DateRangeWithPreset> {
const presets: Record<
Exclude<DatePreset, DatePreset.Custom>,
Required<DateRange>
> = {
[DatePreset.Today]: { from: new Date(), to: new Date() },
[DatePreset.ThisMonth]: { from: new Date(), to: new Date() },
[DatePreset.ThisYear]: { from: new Date(), to: new Date() }
};
// Delete these comments and try to help me solve this problems with types.
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
// readyPreset: any
const readyPreset = presets[preset];
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return readyPreset && { preset, ...readyPreset };
}
// Right behaviors:
// const validUndefinedRange: undefined
const validUndefinedRange = applyPreset(DatePreset.Custom);
// const thisYearRange: Required<DateRangeWithPreset>
const thisYearRange = applyPreset(DatePreset.ThisYear);
console.log("validUndefinedRange", validUndefinedRange);
console.log("thisYearRange", thisYearRange);
有一个函数可以返回带有From、To和Preset值的对象.返回的范围取决于参数. 在我的例子中,DatePreset.Custom参数将始终返回UNDefined,其余的将返回Object. 我找到了一个有效的解决方案,但埃斯林特和TS不喜欢.请帮我正确输入函数.