我在一个类上有这个方法签名:
lock(key: string, opts: any, cb?: LMClientLockCallBack): void;
如果用户这样使用它:
lock('foo', null, (err,val) => {
});
他们将获得正确的输入。但是,如果他们忽略options参数并执行以下操作:
lock('foo', (err,val) => {
});
然后tsc
将回调函数视为类型any
,如下所示:
有什么方法可以让用户避免将空对象或null作为第二个参数传递,并将回调移到另一个位置?
我尝试将方法重载为两个定义:
lock(key: string, cb: LMClientLockCallBack, n?: LMClientLockCallBack) : void;
lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }
但是它仍然不能编译,有新问题:
如果我尝试这样做:
lock(key: string, cb: LMClientLockCallBack) : void;
lock(key: string, opts: any, cb?: LMClientLockCallBack) { ... }
我明白了:
肯定有解决方案吗?
答案 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中一样。