TypeScript допускает необязательные аргументы - методы перегрузки - PullRequest
0 голосов
/ 06 июля 2018

У меня есть подпись этого метода для класса:

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

если пользователь использует его следующим образом:

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

});

они получат правильные наборы. Однако, если они опускают аргумент параметров и делают это:

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

});

затем tsc видит функцию обратного вызова как тип any, вот так:

enter image description here

Есть ли способ, позволяющий пользователям избегать передачи пустого объекта или нуля в качестве второго аргумента и перекладывать обратный вызов?

Я попытался перегрузить метод на два определения:

  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 голосов
/ 06 июля 2018

При перегрузке метода в TypeScript реализация не считается одной из перегрузок. Таким образом, вы должны создать три определения функций: два для разных перегрузок, как вы уже сделали, и третье - с необязательным аргументом и реальной реализацией, которая в вашем коде ошибочно связана со вторым определением перегрузки. Итак, у вас будет:

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

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

Итак, если вторым аргументом является обратный вызов - пользователь получит первые типы перегрузки, если это что-то еще, но третий аргумент является обратным вызовом - вторые типы перегрузки. Но в обоих случаях они будут вызывать одну и ту же реализацию, как в чистом JavaScript.

...