Typescript: есть ли способ использовать inline require, но все же получить проверку типов? - PullRequest
0 голосов
/ 17 марта 2020

Я переносу устаревший код в машинописный текст, и некоторые из файлов, использующих встроенный файл, требуют для повышения производительности (отложенная загрузка):

//DataClass.js

const Data = {
  get Phones() {
    return require('./phones.ts').default;
  },
  get Users() {
    return require('./users.ts').default;
  },

перед преобразованием файла в ts, intelisense работал полностью нормально, и дал мне автозаполнение для всех реквизитов телефона и пользователей (оба они являются файлами TS). но после изменения расширения файла на ts оператор require возвращает any, и я теряю типы.

Я не могу преобразовать код в await import, потому что это означает изменение всего прежнего кодовая база (для поддержки asyn c). Я не против сохранить этот модуль в виде файла .js, но затем я теряю типы в каждом файле .ts, который импортирует данные из этого файла, поэтому, даже если телефоны строго типизированы, я могу получить выгоду от это.

Есть ли способ обойти эту проблему?

1 Ответ

0 голосов
/ 23 марта 2020

Хорошо, это не решение, а обходной путь (я OP), я решил сохранить файл с его расширением js и создать отдельный файл ts с тем же именем для получения типов. , Когда есть два файла с одинаковым именем, упаковщик предпочитает js один, поэтому будет использоваться содержимое файла js со встроенным требованием, но компилятор машинописного текста предпочитает файл ts, поэтому я получаю все проверки типов во время разработки и при запуске tsc typscript сгенерирует правильные объявления для файла.

//DataClass.js (real file, will be included in the real bundle)

export const Data = {
  get Phones() {
    return require('./phones.ts').default;
  },
  get Users() {
    return require('./users.ts').default;
  }
}
//DataClass.ts (fake file, will help typescript compiler to generate declaration file for the index)

import phones from './phones.ts';
import users from './users.ts'

export const Data = {phones, users};

Это определенно не решение, а просто неприятный обходной путь. Но, к сожалению, это единственное решение, которое я получил до сих пор. Если кто-нибудь знает лучшее решение, пожалуйста, опубликуйте его здесь.

...