Как исправить неисправную подпись типа в библиотеке для вашего проекта? - PullRequest
0 голосов
/ 09 февраля 2019

Я использую пакеты debug и @types/debug в своем проекте, и недавнее обновление до @types/debug неработающей типизации для кода, который я знаю, является действительным.

Есть ли способ безошибочно исправитьввод в моем проекте с использованием объявления слияния, поэтому мне не нужно ждать исправления, чтобы сделать его апстрим или скопировать весь .d.ts?

Соответствующая часть из @types/debug такова:

declare var debug: debug.Debug;

export = debug;

declare namespace debug {
    type IDebugger = Debugger;
    interface Debugger {
        log: (v: any) => string;
    }
}

Я добавил свой собственный файл .d.ts с:

declare module 'debug' {
    interface Debugger {
        log: (...args: any[]) => any;
    }
}

, но теперь я получаю ошибки при попытке использовать другие элементы из исходного файла объявлений: «Модуль« отладка »не имеетexported member 'и тому подобное. Похоже, что происходит, когда я добавляю свой собственный файл .d.ts, он не объединяется с оригиналом, но используется как единственное объявление для этого модуля. Почему это происходит и как я могу это сделать?делать то, что я хочу, то есть правильно объединить объявления?

1 Ответ

0 голосов
/ 10 февраля 2019

Вы не можете увеличить сигнатуру log, потому что она определена как тип функции.Если бы он был определен как интерфейс, это было бы возможно, добавив перегрузку:

interface Debugger {
    log: Logger;
}

interface Logger {
  (...args: any[]): any
  (arg: any): string
}

Так что вы можете сделать?

  1. Установить другую версию набора изаблокируйте его (используйте флаг --save-exact при запуске npm install).
  2. Переопределите типы локально и продолжайте использовать их, пока определения в восходящем направлении не будут исправлены.В идеале, внесите свои изменения в DefiniteTyped самостоятельно.

Что касается второго решения, поскольку расширение не является опцией, вам придется заново создать определение полностью и добавить свои изменения.Результат может выглядеть следующим образом:

debug.d.ts

declare module 'debug' {
  var debug: debug.Debug & { debug: debug.Debug, default: debug.Debug };

  namespace debug {
    interface Debug {
      (namespace: string): Debugger;
      coerce: (val: any) => any;
      disable: () => void;
      enable: (namespaces: string) => void;
      enabled: (namespaces: string) => boolean;

      names: RegExp[];
      skips: RegExp[];

      formatters: Formatters;
    }

    type IDebug = Debug;

    interface Formatters {
      [formatter: string]: (v: any) => string;
    }

    type IDebugger = Debugger;

    interface Debugger {
      (formatter: any, ...args: any[]): void;

      enabled: boolean;
      log: Logger
      namespace: string;
      extend: (namespace: string, delimiter?: string) => Debugger;
    }

    interface Logger {
      (...args: any[]): any
      (arg: any): string
    }
  }

  export = debug;
}

Такой файл декларации должен быть включен в ваш проект.

...