函数实现签名,它并不是重载的一部分:
function createLog(message: string): number;
function createLog(source: string, message?: string): number {
return 0;
}
createLog('message'); // OK
createLog('source', 'message'); // ERROR: Supplied parameters do not match any signature
当至少具有一个函数重载的签名时,只有重载是可见的。最后一个声明签名(也可以被称为签名的实现)对签名的形状并没有贡献,因此,要获得所需的行为,你需要添加额外的重载:
function createLog(message: string): number;
function createLog(source: string, message: string): number;
function createLog(source: string, message?: string): number {
return 0;
}
由于 JavaScript 没有函数重载,我们不得不这么做,因此你需要在你的函数中进行参数检查。
例如,你可以要求你的使用者使用匹配的参数对来调用,并正确实现它,而不允许混合参数类型。
function compare(a: string, b: string): void;
function compare(a: number, b: number): void;
function compare(a: string | number, b: string | number): void {
// Just an implementation and not visible to callers
}
compare(1, 2); // OK
compare('s', 'l'); // OK
compare(1, 'l'); // Error.