对于函数参数类型,函数重载可以比联合类型和泛型类型更具体。
现实世界的例子:
createActivity 函数用于创建具有不同输入参数的三种类型的活动。 CreateRenewalActivityParams、CreateInsureActivityParams 和 CreateTrafficGenerationActivityParams。
interface CreateActivityParams {
activityCode: string;
activityName: string;
activityDesc: string;
activityType: number;
activityTypeName: string;
startTime: string;
endTime: string;
paymentType: string | null;
}
interface CreateRenewalActivityParams extends CreateActivityParams {
installmentCases: any[];
}
interface CreateInsureActivityParams extends CreateActivityParams {
cases: any[];
}
interface CreateTrafficGenerationActivityParams extends CreateActivityParams {
cases: any[];
}
export async function createActivity(data: CreateTrafficGenerationActivityParams): Promise<boolean>;
export async function createActivity(data: CreateInsureActivityParams): Promise<boolean>;
export async function createActivity(data: CreateRenewalActivityParams): Promise<boolean>;
export async function createActivity(data: CreateActivityParams): Promise<boolean> {
return true;
}
// TSC throw error
createActivity({
activityCode: 'test code',
activityName: 'test name',
activityDesc: 'test desc',
activityType: 8,
activityTypeName: 'test type name',
startTime: '2021-07-20 00:00:00',
endTime: '2025-07-20 23:59:59',
paymentType: null,
cases: [
{
pictureCode: 'test pic code',
authDesc: null,
},
{
pictureCode: 'test pic code',
authDesc: null,
},
],
installmentCases: [],
});
export async function createActivityUnion(data: CreateTrafficGenerationActivityParams | CreateInsureActivityParams | CreateRenewalActivityParams) {
return true;
}
// TSC pass
createActivityUnion({
activityCode: 'test code',
activityName: 'test name',
activityDesc: 'test desc',
activityType: 8,
activityTypeName: 'test type name',
startTime: '2021-07-20 00:00:00',
endTime: '2025-07-20 23:59:59',
paymentType: null,
cases: [
{
pictureCode: 'test pic code',
authDesc: null,
},
{
pictureCode: 'test pic code',
authDesc: null,
},
],
installmentCases: [],
});
export async function createActivityGeneric<Data extends CreateActivityParams>(data: Data) {
return true;
}
// TSC pass
createActivityGeneric({
activityCode: 'test code',
activityName: 'test name',
activityDesc: 'test desc',
activityType: 8,
activityTypeName: 'test type name',
startTime: '2021-07-20 00:00:00',
endTime: '2025-07-20 23:59:59',
paymentType: null,
cases: [
{
pictureCode: 'test pic code',
authDesc: null,
},
{
pictureCode: 'test pic code',
authDesc: null,
},
],
installmentCases: [],
})
现在,我们希望函数的参数在同时包含 installmentCases 和 cases 字段时报告类型不兼容错误,因为它们属于不同的活动类型,这可以使用函数重载来完成。
我们可以用上述三种参数类型为createActivity函数编写三个更具体的重载签名和一个CreateActivityParams类型的通用实现签名。
TypeScript Playground