Исключить / перезаписать типизацию, предоставленную npm

У меня есть пакет npm с плохо написанными, устаревшими типами. Я написал свою собственную типизацию, и теперь мне интересно, могу ли я как-то исключить исходную типизацию из пакета npm. Это не простое расширение интерфейсов, оригиналы на данный момент в основном мусор.

Использование списка исключений в tsconfig.json, конечно, не работает для этой цели, поскольку он по-прежнему загружает файлы из node_modules, даже если вы исключите эту папку.


person Simon Meskens    schedule 13.01.2017    source источник
comment
Вы можете попробовать использовать пути в tsconfig.json для переопределения вводы для любого модуля, как описано в этом ответе   -  person artem    schedule 13.01.2017
comment
Это правильный ответ. Я не нашел этот вопрос с помощью Google, потому что я пробовал разные формулировки, но, видимо, не тот.   -  person Simon Meskens    schedule 13.01.2017
comment
Не стесняйтесь добавить это в качестве ответа, и я приму его   -  person Simon Meskens    schedule 13.01.2017


Ответы (2)


Вы можете получить желаемое поведение с помощью параметра paths в tsConfig. Это может выглядеть примерно так:

{
    "compilerOptions": {
       ...
        "paths": {
            "*": [
                "src/*",
                "declarations/*"
            ]
        }
    },
    ...
}

С этой конфигурацией typescript ищет модули в src (там должен быть весь исходный код приложения), а также в объявлениях, в папке объявлений я обычно помещаю свои дополнительные необходимые объявления.

Чтобы переопределить типизацию модуля узла, есть два варианта:

  1. поместите папку с именем, аналогичным модулю, в папку объявлений, содержащую файл с именем index.d.ts для типизации

  2. поместите файл декларации, названный как модуль, в папку деклараций

В качестве рабочего примера вы можете взглянуть на это репо https://github.com/kaoDev/react-ts-sample

Важный совет от Бернхарда Кенига:

Порядок путей имеет значение. Мне пришлось поместить путь с моими переопределениями до пути с исходными определениями типов, чтобы мои переопределения были подобраны первыми. - Бернхард Кениг

person Kalle    schedule 13.01.2017
comment
Не работает модуль nats-hemera npm, не могли бы вы проверить? - person Vladimir Djukic; 26.04.2018
comment
Порядок путей имеет значение. Мне пришлось поместить путь с моими переопределениями до пути с исходными определениями типов, чтобы мои переопределения были подобраны первыми. - person Bernhard Koenig; 17.06.2018
comment
Будьте осторожны с двумя вещами с переопределением путей: 1) Правая цель для перенаправления пути находится относительно baseUrl. Если установлен неверно, он может автоматически выйти из строя (или работать для некоторых, но не для других, в зависимости от способа ссылки на файл d.ts). 2) Даже если он установлен правильно, в некоторых случаях требуется добавить пустое объявление declare module "my-module"; где-нибудь в *.d.ts файлах вашего проекта. Пример, требующий обоих исправлений выше: [email protected] (именно эта версия) - person Venryx; 15.11.2019

Создайте папку node_modules под своим src, затем поместите в нее типы модулей, которые вы хотите перезаписать:

├── node_modules
│   └── ...
│
└── src
    ├── index.ts
    ├── ... your codes ...
    │
    └── node_modules
        └── <module-to-be-overwritten>
            └── index.d.ts

Нет необходимости изменять compilerOptions в tsconfig.json.

Прочтите раздел Как TypeScript разрешает модули в https://www.typescriptlang.org/docs/handbook/module-resolution.html.

person aleung    schedule 11.06.2018
comment
Это работает не для всех случаев - например, [email protected] (эта точная версия) - но работает для большинства. Я больше предпочитаю подход с использованием путей, поскольку он работает для каждого случая и не требует создания поддельных / переопределенных каталогов. (Я бы предпочел добавить одну строку в tsconfig.json, чем создавать две новые папки и файл, которые являются простыми заглушками, но для каждой свои собственные) - person Venryx; 15.11.2019