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

Я использую 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

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

Здесь я получил ключ к синтаксису import * ... и добавил свойство map в tsconfig:

Всего 1 ответ


Как использовать 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 (включая объекты пространства имен модулей ) здесь .


Есть идеи?

10000