LINUX.ORG.RU

TypeScript: импортить модули, лежащие где попало по абсолютным путям.

 


0

2

Есть программа: /home/me/project/main.ts

import {Sobaka} from "./auto/sobaka.js"
import {Blabla} from "./auto/blabla.js"
console.log("hello")

Проблема в

/home/me/project/main.ts:N:M - error TS2307: Cannot find module './auto/sobaka.js' or its corresponding type declarations.

потому, что на самом деле никакого ./auto/ в текущем поддереве нет и никогда не будет! Это самое интригующее и раскрыто далее после заголовка «ЦИМЕС ВОПРОСА». Что там за Sobaka и Blabla читателю не важно, суть не в них, они норм. Если их положить в текущий каталог с main.ts и написать «./sobaka.js», то всё работает.

Так же есть /home/me/project/tsconfig.json:

{
  "compilerOptions": {
    "target" : "ES2016",
    "module" : "nodenext",
    "noImplicitAny": true,
    "removeComments": true,
    "preserveConstEnums": false,
    "moduleResolution": "nodenext",
    "sourceMap": false,
    "strictNullChecks" : true,
    "strictPropertyInitialization" : true,
    "outDir" : "/tmp/some/output/dir/blabla",
    "rootDirs" : [
       "/tmp/generated",
       "/home/me/project"
    ]
  },
  "include" : [
    "/home/me/project/main.ts"
   ]
}

Запускаю обычно так и всё собирается: tsc --build /home/me/project/tsconfig.json. Обычно, это когда не нужны были извращения из этого треда.

цимес вопроса:

Есть некий автосгенерированный .ts код, можно сказать «модуль» (при моём слабом понимании теории модулей TS): .ts файлы в папочке /tmp/generated/ или в любом другом одноразовом месте, про которое (место) базовый код знать не хочет:

/tmp/generated/auto/sobaka.ts
/tmp/generated/auto/blablabla.ts

Вот их инклудить я и хочу в main.ts, но не знаю как. Класть эти файлы в основное дерево (в репу) нельзя. Они генерятся при каждой сборке, там всякие актуальные константы и одноразовые интерфейсы.

  1. Пробовал добавить /tmp/generated/ в rootDirs как показано в tsconfig.json выше - не взлетело/

  2. Пробовал такое:

import {Sobaka} from @auto/sobaka.js

И добавить в tsconfig.json такое:

...
"baseUrl" : "/home/me/project/",
"paths" : {
   "@auto/*" : ["/tmp/generated/auto/*"]
}
...

Ошибка та же.

Помогите научиться инклудить валяющуюся где угодно по абсолютному пути фигню успешно, не указывая абсолютных путей в коде? Спасибо.



Последнее исправление: lesopilorama (всего исправлений: 1)

TS-код используется только как средство написать JS

Нормальные люди для такого используют текстовый редактор или IDE, а не какой-то ts.

firkax ★★★★★
()

Смотри сюда, там у людей похожие проблемы.

Я бы на самом деле посоветовал организовать свой кот в виде отдельных подпроектов (NPM-пакетов) в одном git-репозитории, используя фичу NPM workspaces; тогда взаимодействие между твоими собаками будет происходить точно так же, как между любыми другими NPM-пакетами (добавление одного пакета в список зависимостей другого, импорт нужных имён, …), и ты не будешь делать нам тут беременную голову своими проблемами XY.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 5)
Ответ на: комментарий от Nervous

Спасибо. Близкое советовали в одном чатике про TS. Всё сводится к монорепе, в которой можно опираться на относительные пути через ../../ хотя-бы.

npm и nodejs не хотелось бы юзать просто по соображениям минималистичности: хочется зависить только от наличия tsc (который пусть и поставлен чреез npm), но уже без всяких там workspaces хочется обойтись на текущий момент.

И вот ./auto/ похоже всё-таки придётся держать прямо в репе, а не пытаться выносить в /tmp/generated/auto/… ?

lesopilorama
() автор топика
Ответ на: комментарий от lesopilorama

./auto/ похоже всё-таки придётся держать прямо в репе

В чём проблема-то, обычно там и так куча всякого хлама валяется, игнорируемого гитом — результаты сборки, отчёты по тестам, .envы и проч., и проч.

Будет ещё одна кучка хлама, вот и всё.

Nervous ★★★★★
()