&引用;应为0个参数,但得到2个;使用TypeScript重载

&引用;应为0个参数,但得到2个;使用TypeScript重载,typescript,Typescript,我有一个带有重载方法的类(两个版本) 一个版本不接受任何参数。第二个可能需要两个 class DFD { ... getEndDatetime(): string; getEndDatetime(startTime?: string, duration?: number): string { if (!startTime || !duration) { return new Date(this.getEndDatetimePOSIX())

我有一个带有重载方法的类(两个版本)

一个版本不接受任何参数。第二个可能需要两个

class DFD {
...
    getEndDatetime(): string; 
    getEndDatetime(startTime?: string, duration?: number): string {
        if (!startTime || !duration) {
            return new Date(this.getEndDatetimePOSIX()).toLocaleString();
        } else {
            this.getEndDatetimePOSIX(startTime, duration);
            return new Date(this.getEndDatetimePOSIX(startTime, duration)).toLocaleString();
        }
    }
...
}
当我调用
this.getEndDateTime(“2019年11月8日,晚上11:42:17”,5)
时,TypeScript给了我一个错误,
“预期0个参数,但得到2个。”
我如何满足这里的TypeScript

我正在运行节点v10.16.0,使用类型脚本v3.5.2。我尝试过切换重载的顺序:

// Switch the order
...
    getEndDatetime(startTime?: string, duration?: number): string;
    getEndDatetime(): string { 
        ...
    }
...
然后,TypeScript突出显示代码中的
startTime
duration
,表示找不到它

我希望我的第一个重载实现在使用两个参数调用时不会抛出任何错误,但它确实抛出了错误


建议我的代码应该通过。

这可能是因为由于两个参数签名是可选的,传输程序无法确定要调用哪个方法。换句话说,
getEndDateTime()
可以引用您定义的任一签名。为了支持这一点,您需要使
startTime
duration
不再是可选的

getEndDatetime(): string; 
getEndDatetime(startTime: string, duration: number): string; 
getEndDatetime(startTime?: string, duration?: number): string {
    if (!startTime || !duration) {
        return new Date(this.getEndDatetimePOSIX()).toLocaleString();
    } else {
        this.getEndDatetimePOSIX(startTime, duration);
        return new Date(this.getEndDatetimePOSIX(startTime, duration)).toLocaleString();
    }
}

这可能是因为transpiler无法确定要调用哪个方法,因为这两个参数签名是可选的。换句话说,
getEndDateTime()
可以引用您定义的任一签名。为了支持这一点,您需要使
startTime
duration
不再是可选的

getEndDatetime(): string; 
getEndDatetime(startTime: string, duration: number): string; 
getEndDatetime(startTime?: string, duration?: number): string {
    if (!startTime || !duration) {
        return new Date(this.getEndDatetimePOSIX()).toLocaleString();
    } else {
        this.getEndDatetimePOSIX(startTime, duration);
        return new Date(this.getEndDatetimePOSIX(startTime, duration)).toLocaleString();
    }
}

当两个参数都是可选参数时,为什么要列出no arg重载?只需删除第二个具有空参数的声明即可argument@JeffBowman经过考虑,这不是必要的。其中一个原因可能是文档,但在我的案例中这并不实用。另一个原因是强调这两个实现(重载语法澄清了它是0个参数还是2个参数。仅使用可选参数会使您不清楚是否应该使用0、1或2个参数)。我现在提出这个问题的基础是更好地理解打字脚本。为什么调用该方法时会出现错误,因为我使用了看似有效的重载语法。“无参数重载”是不允许的吗?当两个参数都是可选的时,为什么要列出无参数重载?只需删除第二个具有空参数的声明即可argument@JeffBowman经过考虑,这不是必要的。其中一个原因可能是文档,但在我的案例中这并不实用。另一个原因是强调这两个实现(重载语法澄清了它是0个参数还是2个参数。仅使用可选参数会使您不清楚是否应该使用0、1或2个参数)。我现在提出这个问题的基础是更好地理解打字脚本。为什么调用该方法时会出现错误,因为我使用了看似有效的重载语法。“无参数重载”是不允许的吗。因此,最后一个
getEndDatetime
是实际实现,前两个是签名。因此,对于少于三个
funcNames
(或
getEndDate()
s)的情况,您永远不会让方法/函数重载。就我而言,我只给了它一个签名,没有参数。代码中的第二行添加了第二个选项,使带有两个参数的方法调用有效。因此,最后一个
getEndDatetime
是实际实现,前两个是签名。因此,对于少于三个
funcNames
(或
getEndDate()
s)的情况,您永远不会让方法/函数重载。就我而言,我只给了它一个签名,没有参数。代码中的第二行添加了第二个选项,使带有两个参数的方法调用有效。