根据this documentation,TypeScript应该允许您重载函数,但是当我尝试在类方法的上下文中这样做时,会导致编译器错误。我在做什么错了?
// This approach does NOT work
class Sanitizer {
sanitizeDate(date: string): string { // COMPILER ERROR: "Duplicate function implementation"
return date.replace(/\//g, '-');
}
sanitizeDate(date: Date): string { // COMPILER ERROR: "Duplicate function implementation"
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
}
const sanitizer = new Sanitizer();
const pathFriendlyDate1 = sanitizer.sanitizeDate('2019/08/08');
const now = new Date();
const pathFriendlyDate2 = sanitizer.sanitizeDate(now); // COMPILER ERROR: "Argument of type 'Date' not assignable to parameter of type 'string'"
// ----------------------------------------
// This approach DOES work (no overloading)
class SanitizerNoOverloading {
sanitizeDateStr(date: string): string {
return date.replace(/\//g, '-');
}
sanitizeDate(date: Date): string {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
}
const sanitizer2 = new SanitizerNoOverloading();
const pathFriendlyDate3 = sanitizer2.sanitizeDateStr('2019/08/08');
const pathFriendlyDate4 = sanitizer2.sanitizeDate(now);
我收到2个编译器错误,提示“函数实现重复”。
是否需要更改tsc设置才能使其正常工作,还是只是不支持?
答案 0 :(得分:1)
打字稿中重载的工作方式只是签名重载。对于同一个方法,您可以有多个签名(带有一个可以满足所有重载的私有实现签名),但可以有一个方法主体。由实现来区分重载。您可以在docs中了解有关此内容的更多信息。
class Sanitizer {
sanitizeDate(date: Date): string
sanitizeDate(date: string): string
sanitizeDate(date: Date | string): string {
if (typeof date === "string") {
return date.replace(/\//g, '-');
} else {
return `${date.getFullYear()}-${date.getMonth() + 1}-${date.getDate()}`;
}
}
}
var s = new Sanitizer();
s.sanitizeDate("a")
s.sanitizeDate(new Date());
之所以采用这种方法,是因为JavaScript没有真正的函数重载,而打字稿的目标只是向JavaScript添加类型,而不是向语言添加任何额外的运行时功能。