Правильные шаги / синтаксис для импорта библиотеки в файл машинописного текста с пространством имен в нем - PullRequest
2 голосов
/ 14 мая 2019

Я использую Typescript с Nodejs, Windows 7 Ultimate x64.Компилятор tsc.

Я изменяю существующую кодовую базу, в которой много файлов, совместно использующих пространство имен.Итак, в верхней части каждого файла есть объявление вроде:

namespace program {
    ...
}

Я пытаюсь заставить библиотеку JSZip работать в этой существующей кодовой базе, но я столкнулся с какой-то странностью, которая, я думаю, должнасделать с этим пространством имен.

Прежде чем начать, я хочу описать, как я настраивал библиотеку.Сначала я вызвал npm, например, для установки:

npm install --save jszip
npm install --save @types/jszip

Затем я настроил свой tsconfig.json так:

var map = {
    'jszip':                      'node_modules/jszip/dist/jszip.min.js'
};

Я не уверен, что шаг имеет значение, но он можетПозвольте вызвать импорт "jszip" ниже.

Затем я попробовал несколько команд импорта в коде, но столкнулся с ошибками.Сначала я попробовал:

import * as JSZip from 'jszip';

namespace program {
    ...
}

Но это вызывает большое количество ошибок в этом файле.Я получаю предупреждение «Пространство имен объявлено, но никогда не используется» для этого большого пространства имен, по крайней мере, в файле, в котором выполняется вызов импорта. Каждая ссылка на внешний файл в этом пространстве имен также не работает, и для тех, кто получает «Не могу»найти имя "..." "ошибка.Таким образом, вызов импорта таким образом кажется несовместимым с использованием пространства имен.

Итак, я попытался:

namespace program {
    import * as JSZip from 'jszip';

    ...
}

Итак, в этом случае я по крайней мере не получаю файл-широкие ошибки, но эта строка все еще создает ошибки.Я получаю два сообщения: «Объявления импорта в пространстве имен не могут ссылаться на модуль».и «Не удается найти модуль« jszip »» (в частности, я не получаю последнюю ошибку при использовании предыдущего метода.)

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

types / jszip: https://www.npmjs.com/package/@types/jszip

jszip: https://www.npmjs.com/package/jszip

Это близкий пример, но не идентичный моему случаю.Я не думаю, что предложенные решения будут работать в моей ситуации, но я могу ошибаться: Как использовать пространства имен с импортом в TypeScript

Вот где я получил подсказку для "синтаксис import * ... "и добавление свойства" map "в tsconfig: Импорт JSZip в проекте Angular 2

1 Ответ

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

Как использовать JSZip в старомодном окружающем проекте с объединенными файлами JavaScript

Из официальной документации JSZip можно установить вручную:

Вручную : загрузите JSZip и включите файл dist/jszip.js или dist/jszip.min.js

Для TypeScript самый простой способ - без набора текста.Создайте новый файл с таким содержимым:

// global-defs.d.ts
declare const JSZip: any;

Или вы можете попытаться импортировать набор текста вручную.Создайте файл jszip.d.ts и вставьте все содержимое , набрав его .Теперь удалите последнюю строку export = JSZip;.Ваш файл заканчивается на:

declare var JSZip: JSZip;

Затем должен работать код из документации пакета .

Классическое решение для нового проекта

В чистой директории:

npm init
npm install --save jszip
npm install -D @types/jszip typescript

Затем создайте действительный файл tsconfig.json.Например:

{
  "compilerOptions": {
    "module": "commonjs",
    "moduleResolution": "node",
  },
  "exclude": [
    "node_modules"
  ]
}

Создайте исходный файл:

// main.ts
import JSZip = require('jszip');

// Here, use the code from the package documentation
// here: https://www.npmjs.com/package/jszip

Несколько советов:

  • Не используйте import * as JSZip для чего-то, что не является объект пространства имен модуля .Вы должны использовать import JSZip = require(…) в вашем случае.
  • Не использовать пространства имен TypeScript и модули ES6 вместе .Ваш код импортирует модуль, поэтому просто удалите namespace program.

Дополнительная документация по модулям ES6 (включая объекты пространства имен модулей ) здесь .

...