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

TypeScript allow for optional arguments - overloading methods

我在 class:

上有这个方法签名
lock(key: string, opts: any, cb?: LMClientLockCallBack): void;

如果用户这样使用它:

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

});

他们会得到正确的打字。但是,如果他们省略选项参数并执行此操作:

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) { ... }

我明白了:

这个肯定有解决办法吧?

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

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

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

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

中一样