Включение устаревшего JS в модуль Typescript

У компании есть старый JS-файл с именем legacy.js
. Цель состоит в том, чтобы использовать этот файл в новом модуле, который пишется с использованием
. Машинопись. Назовем его модулем «перемычка».

Затем другой разработчик извлечет этот модуль из git и использует его в проекте под названием «jumperdemo» и получит следующую ошибку:

Failed to compile.

../jumper/dist/index.js Module not found: Can't resolve 'Legacy' in '{base path}\jumper\dist'

Простые шаги репо:

git clone https://github.com/warrick-eosny/jumper.git
cd jumper
npm install
tsc 
cd dist
npm link

cd ..

git clone https://github.com/warrick-eosny/jumpdemo.git
cd jumpdemo
npm install
npm link jumper
yarn start

Мне становится ясно, что этот паттерн не работает, но неясно, какой паттерн лучше.

Я знаю, что я не первый человек, который захочет включить устаревший JS в модуль TS, поэтому мне явно не хватает чего-то важного.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
0
531
1

Ответы 1

Один подход для вашей конкретной ситуации

Сначала измените файл *.d.ts.

  • Удалите declare module 'Legacy', чтобы объявить модуль ./relative.
  • Добавьте export default class..., чтобы соответствовать стилю экспорта legacy.js.
  • Переместите файл на src/legacy.d.ts, чтобы его путь соответствовал пути устаревшего модуля.

Затем измените файл src/index.ts, чтобы импортировать и реализовать экспорт по умолчанию для устаревшего класса.

Результат будет выглядеть так (с опущенным кодом).

// src/index.ts
import legacy from './legacy';
let oldObj = new legacy(); 

// src/legacy.js (unchanged)
export default class OldOldClass {
    runSuperOldLogic(someInput) {
        console.info('really old logic run ' + someInput);
    }
}

// src/legacy.d.ts
export default class OldOldClass {
    runSuperOldLogic(someInput: string): any;
}   

Два альтернативных подхода

В документах TypeScript есть статья при переходе с JavaScript. Слишком много подходов к их детализации. Вот два, которые могут соответствовать вашей ситуации: используйте allowJs для использования локального JavaScript без типов; или измените legacy.js на legacy.ts и поместите типы в соответствие с реализацией.

И...

Я раздвоил ваше потрясающее репо с минимальным сэмплом и сделал для него пиар здесь https://github.com/warrick-eosny/jumper/pull/1/jumper

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

Warrick FitzGerald 07.01.2019 02:56

Дайте мне знать, если вам нужна дополнительная помощь по слиянию.

Shaun Luttin 07.01.2019 17:41

Другие вопросы по теме