Как смешивать фоновые и неэмбиентные файлы определения машинописного текста

У меня есть более старый проект typescript, который использует метод /typings/tsd.json для обработки файлов .d.ts, а также использует ключевое слово Typescript module для компиляции исходного кода в шаблон модуля javascript IIFE. Параметр модуля в tsconfig.json (commonjs/amd/etc.) игнорируется этим ключевым словом.

Для демонстрации я добавляю в этот проект более новый машинописный код, в котором используется более типичный метод ключевых слов import и export с загрузчиком модулей SystemJS, с файлами .d.ts в /node_modules/@types/.

После некоторой гимнастики Gulp/SystemJS все это работает вместе во время выполнения, и я на пути к тому, чтобы уложиться в срок. Но у меня возникли проблемы во время компиляции в одном сценарии, который я хотел бы решить.

Когда я изменяю старый код, чтобы использовать класс (модель) из нового кода, я хочу, чтобы старый код знал о .d.ts нового кода. Поэтому я добавил в начало файла старого кода /// <reference path="../../newercode/feature4/models/NewerModels.d.ts"/>. (В качестве альтернативы я помещаю ту же строку в tsd.d.ts, но получаю тот же результат.)

Компилятор жалуется, что мой старый код «имеет или использует частное имя NewModel».

Внутри NewerModels.d.ts ключевые слова import и export все еще присутствуют, в то время как ни один из файлов .d.ts уже в /typings/ не использует эти ключевые слова. Эти ключевые слова являются причиной ложной ошибки компилятора.

Устаревшему проекту нужны файлы окружения .d.ts, новый код создает файлы без окружения.

Могу ли я что-нибудь с этим поделать?


person Ron Newcomb    schedule 14.09.2017    source источник
comment
Я бы предложил вместо того, чтобы продолжать использовать tsd, перейти на использование @types. Вы должны быть в состоянии сделать это одним выстрелом.   -  person unional    schedule 14.09.2017
comment
Файл .d.ts, который вы получаете для пакета, зависит от того, откуда вы его взяли. Если бы я это сделал, то все файлы .d.ts имели бы ключевые слова импорта/экспорта, поэтому ни один устаревший код вообще не скомпилировался бы.   -  person Ron Newcomb    schedule 14.09.2017
comment
Более новые файлы, которые вы получаете от @types, должны иметь такой же синтаксис. Исходная библиотека по-прежнему остается той же библиотекой CommonJS (если это не изменится, вам придется иметь дело с управлением версиями). tsd получает файлы из DefinitelyTyped и так же, как @types. Команда TS неплохо поработала и преобразовала формат. Дайте ему попробовать, чтобы увидеть, если это работает.   -  person unional    schedule 14.09.2017
comment
С другой стороны, ошибка, которую вы видите, жалуется, что вы не экспортировали NewModel. Может быть, вы не включили его в свой package.json/dist?   -  person unional    schedule 14.09.2017
comment
Хороший вопрос, но устаревший проект использует устаревший .d.ts, поэтому даже если в настоящее время один и тот же файл .d.ts получен из обоих источников, старый проект компилируется со старым .d.ts, в котором отсутствуют проблемные ключевые слова.   -  person Ron Newcomb    schedule 15.09.2017


Ответы (1)


Мое текущее решение не идеально, но оно работает для демонстрационных целей.

Я создаю новую папку в /typings/ с именем /feature4/ и копирую туда соответствующие файлы .d.ts. Отредактируйте их, чтобы удалить ключевые слова export, при необходимости измените их, чтобы удалить ключевые слова import, и замените ключевое слово class на interface, чтобы исправленный устаревший код не пытался выполнить необработанный вызов new NewerModel().

Этот последний бит, очевидно, не будет работать, потому что более новые классы на самом деле не существуют в глобальном пространстве имен, и изменение с class на interface помогает препятствовать этому. Поскольку я в основном беру модели, интерфейс не теряет функциональности, кроме требования, чтобы new NewerModel() было записано как <NewerModel>{}, но я по-прежнему получаю проверку свойств модели во время компиляции, что в любом случае составляет 95% того, что я хотел.

У меня также есть несколько сервисов, которые обрабатываются таким же образом, но методы вызова для них все еще работают из-за внедрения зависимостей. Службы никогда не вызывались из глобального пространства имен.

Это решение, очевидно, будет иметь проблемы, если кто-то изменит /newercode/feature4/models/NewerModels.ts, но 1) не должно быть ничего между настоящим моментом и крайним сроком, и 2) если это действительно проблема Я мог бы создать задачу Gulp для автоматизации копирования и редактирования файлов .d.ts в каждой сборке.

person Ron Newcomb    schedule 15.09.2017