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.
中一样
我在 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.
中一样