function overloads can be more specific than union type and generic types for function argument types.
Real-world example:
The createActivity function is used to create three types of activities with different input parameters. CreateRenewalActivityParams, CreateInsureActivityParams and 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: [],
})
Now, we want the function's arguments to report a type incompatibility error when they contain both installmentCases and cases fields, because they belong to different activity types, which can be done using function overloads.
We can write three more specific overload signatures for the createActivity function with the above three parameter types and a general implementation signature with the CreateActivityParams type.
TypeScript Playground