Проект TypeScript со ссылками - PullRequest
5 голосов
/ 12 марта 2019

Я использую ссылки на проекты для ссылки на "общий" проект из "передних" и "задних".

tsc -v: Version 3.3.3

Структура проекта:

./{MY_PROJECT}.code-workspace   /* the only file in this level */
./back
./back/tsconfig.json
./shared/src/
./shared/
./shared/tsconfig.json
./shared/src/
./front
./front/tsconfig.json
./front/src

Я пытаюсь импортировать модуль в ./front/src/article-view-model.ts из общего проекта:

import Article from "@shared/src/article";            // alias path
import Article from "../../shared/src/article"; // full relative path
export default class ArticleViewModel {
}

В графическом интерфейсе VS Code сразу отображаются следующие ошибки:

Для псевдонима пути:

Не удается найти модуль '@ shared / src / article'. TS (2307)

Для полного относительного пути:

Выходной файл '../../shared/src/article' не был построен из исходного файла 'c: / {SOMEWHERE_IN_MY_PC} /shared/src/article.ts'. TS (6305)

Intellisense (VS Code) работает как для псевдонима, так и для относительных параметров:

Intellisense

Если я попытаюсь игнорировать ошибки и выполнить сборку, произойдет сбой:

C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 1296 бросить е; ^

Ошибка: ошибка отладки. Ложное выражение. at mergeSymbol (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 25861: 26) в C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 25960: 47 в Map.forEach () at mergeSymbolTable (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 25958: 20) at initializeTypeChecker (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 48653: 21) at Object.createTypeChecker (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 25711: 9) в getDiagnosticsProroductionTypeChecker (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 71398: 93) в Object.getGlobalDiagnostics (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 71755: 72) в Object.getGlobalDiagnostics (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 73528: 86) в buildSingleProject (C: \ Program Files \ nodejs \ node_modules \ npm \ bin \ node_modules \ typescript \ lib \ tsc.js: 75803: 127)

. / Front / tsconfig.json содержимое:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "baseUrl": ".",
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/front-bundle.js",
        "paths": {"@shared/*" : ["../shared/*"]},
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ],
    "references": [
        {
            "path": "../shared"
        }
    ]
}

. / Shared / tsconfig.json содержимое:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/shared-bundle.js",
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}

Ответы [ 4 ]

1 голос
/ 14 марта 2019

Я могу воспроизвести ошибки, которые вы получаете , если У меня есть ошибка tsconfig.json в каталоге, который содержит front, back и shared.В этом случае при запуске tsc -b будет забрано ошибочное значение tsconfig.json в текущем каталоге, и поскольку для него не задано правильное значение paths или что-либо еще, компиляция завершится неудачно с теми же ошибками, которые вы получили.

В противном случае, если я использую ваши файлы и выдаю tsc -b front вместо tsc -b, он компилируется без ошибок.

Причина, по которой VSCode не сталкивается с проблемами, заключается в том, что для обеспечения завершения редакторы TypeScript (обычно) использовать инструмент, предоставляемый TypeScript, который называется tsserver.И когда редактор указывает путь к файлу tsserver, tsserver получает соответствующий tsconfig.json, просматривая каталог, содержащий исходный файл, а затем поднимается в родительский каталог и так далее, пока не найдет tsconfig.json файл.Поэтому, когда VSCode работает на front/src/foo.ts и просит tsserver предоставить завершение, tsserver ищет в front/src, который не имеет соответствующего файла, а затем front и находит там tsconfig.json.

0 голосов
/ 16 мая 2019

Я решил это немного после моей последней активности здесь, но я не был уверен на 100%, произошло ли это из-за следующих изменений. В любом случае, я публикую его здесь, так как есть еще новые мнения и голоса, поэтому он может быть ценным для других:

Это было изменение:

В . / Shared / tsconfig.json содержимое: Вместо:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "out": "./lib/shared-bundle.js", <-------------
        "preserveConstEnums": true,
        "removeComments": true,
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}

Использование:

{
    "compilerOptions": {
        "allowSyntheticDefaultImports": true,
        "composite": true,
        "declaration": true,
        "module": "amd",
        "noEmitOnError": true,
        "noImplicitAny": false,
        "outDir": "./lib/", <-------------
        "preserveConstEnums": true,
        "removeComments": true,
        "rootDir": "./src", <-------------
        "sourceMap": true,
        "target": "es2015",
        "watch": true
    },
    "include": [
        "./src/**/*.ts",
    ]
}
0 голосов
/ 15 марта 2019

Если вы компилируете из корневой папки, попробуйте добавить локальный файл tsconfig.json со всеми настройками references, т.е. references: { path: './shared' }. В противном случае tsc не найдет соответствующий проект для сборки.

Кроме того, отсутствие рута tsconfig.json не не позволит графическому интерфейсу VSCode работать должным образом при поиске root tsconfig.json (это состояние, когда я проверял его в последний раз, здесь вы можете найти связанная проблема ).

Ошибка, похоже, связана с отсутствующим файлом. Если вы можете предоставить более подробную информацию о строительных шагах, которые вы делаете, я могу попытаться проверить это лучше

0 голосов
/ 14 марта 2019

Это полностью не отвечает на ваш вопрос напрямую, но я чувствую, что все еще может быть полезно предложить альтернативу.

Один из способов решить эту проблему «более стандартным» способом - это сделать ваш3 кодовых базы всего пакета NPM.

Таким образом, ваш импорт будет выглядеть примерно так: @vendor/shared/foo вместо ../../../../shared/src/article.

Использование npm link позволяет легко работать над взаимозависимостью проекта..

Технически вам даже не нужно изменять исходную структуру (хотя, возможно, вы захотите).Зависимость shared просто становится мягкой ссылкой через node_modules.

...