尽管有文档,但类方法的函数重载是编译器错误

时间:2019-08-09 16:58:56

标签: node.js typescript

根据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设置才能使其正常工作,还是只是不支持?

1 个答案:

答案 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());

Play

之所以采用这种方法,是因为JavaScript没有真正的函数重载,而打字稿的目标只是向JavaScript添加类型,而不是向语言添加任何额外的运行时功能。