Как реализовать интерфейс с несколькими анонимными функциями в машинописном тексте - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь реализовать интерфейс, показанный ниже в машинописном тексте

interface A{
  (message: string, callback: CustomCallBackFunction): void;
  (message: string, meta: any, callback: CustomCallBackFunction): void;
  (message: string, ...meta: any[]): void;
  (message: any): void;
  (infoObject: object): void;
} 

здесь Определение CustomCallBackFunction

type CustomCallBackFunction= (error?: any, level?: string, message?: string, meta?: any) => void;

Я не могу реализовать интерфейс с классом. Есть идеи, как это сделать.

Это для перегрузки метода Например, у меня есть класс B с переменной типа A с реализацией, относящейся ко всем другим параметрам.

class B {
public c: A
}

Тогда я могу позвонить

const b =new B();
b.c(message,callback);
b.c(message,meta,callback);
b.c(message,meta);
b.c(infoObject);

1 Ответ

0 голосов
/ 07 августа 2020

К сожалению, единственный способ реализовать этот интерфейс - сделать все аргументы any.

Этот интерфейс очень похож на перегрузки функций. Это означает, что функция реализации должна принимать аргумент это объединение всех возможных аргументов в этой позиции.

  1. Первый аргумент - string, string, string, any или object. Таким образом, тип - string | object | any, что упрощается до any, поскольку any включает в себя другие возможности.

  2. Второй аргумент - CustomCallBackFunction | any | undefined, который снова равен any.

  3. Третий аргумент может быть CustomCallBackFunction или вторым элементом ...meta: any[], так что снова, это any.

Итак, учитывая, что все аргументы должны быть типа any, и , может быть любое количество аргументов, я думаю, что единственная сигнатура реализации, которая будет работать:

const fn: A = (...args: any[]) => {}

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

const fn: A = (...args: any[]) => {
    if (args.length === 2 && typeof args[0] === 'string' && typeof args[1] === 'function') {
        // (message: string, callback: CustomCallBackFunction): void;
        const [message, callback] = args as [string, CustomCallBackFunction]
    } else if (args.length === 3 && typeof args[0] === 'string' && !Array.isArray(args[1]) && typeof args[2] === 'function') {
        // (message: string, meta: any, callback: CustomCallBackFunction): void;
        const [message, meta, callback] = args as [string, any, CustomCallBackFunction]
    } else {
        // etc...
    }
}

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...