TypeScript允许使用可选参数-重载方法

时间:2018-07-06 03:19:15

标签: typescript typescript2.0 tsc

我在一个类上有这个方法签名:

lock(key: string, opts: any, cb?: LMClientLockCallBack): void;

如果用户这样使用它:

lock('foo', null, (err,val) => {

});

他们将获得正确的输入。但是,如果他们忽略options参数并执行以下操作:

lock('foo', (err,val) => {

});

然后tsc将回调函数视为类型any,如下所示:

enter image description here

有什么方法可以让用户避免将空对象或null作为第二个参数传递,并将回调移到另一个位置?

我尝试将方法重载为两个定义:

  lock(key: string, cb: LMClientLockCallBack, n?: LMClientLockCallBack) : void;

  lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }

但是它仍然不能编译,有新问题:

enter image description here

如果我尝试这样做:

  lock(key: string, cb: LMClientLockCallBack) : void;

  lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }

我明白了:

enter image description here

肯定有解决方案吗?

1 个答案:

答案 0 :(得分:2)

在TypeScript中重载该方法时,实现不算作重载之一。因此,您应该创建三个函数定义:两个已经定义了不同的重载,第三个-具有可选参数和实际实现,它们在您的代码中错误地连接到第二个重载定义。因此,您将拥有:

lock(key: string, cb: LMClientLockCallBack) : void;
lock(key: string, opts: any, cb: LMClientLockCallBack): void;

lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }

因此,如果第二个参数是回调-用户将获得第一个重载类型,如果还有其他东西,但第三个参数是回调-用户将获得第二个重载类型。但是在两种情况下,它们都将调用相同的实现,就像在纯JavaScript中一样。