我使用Typescript与Nodejs,Windows 7最终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“(特别是,在使用前面的方法时,我不会得到后者的错误)。
所以这让我觉得我的方法或设置有问题,但即使我停留在一个相对简单的点上,我还没有找到资源来帮助理解确切的问题。当然,我找到了一些资源,我已经拼凑了一个有限的了解,至少,这里的链接:
类型/jszip:https://www.npmjs.com/package/@types/jszip
jszip:https://www.npmjs.com/package/jszip
这是一个很好的例子,但与我的情况不同。我认为提出的解决方案在我的情况下是行不通的,但我可能错了:How to use namespaces with import in TypeScript
这就是我获得“import*…”语法的线索,并将“map”属性添加到tsconfig:Import JSZip in Angular 2 project

最佳答案

如何在带有连接javascript文件的老式环境项目中使用JSZip
official documentation中,可以手动安装jszip:
手动:downloadjszip并包含文件dist/jszip.jsdist/jszip.min.js
对于typescript,最简单的方法是不打字。创建包含以下内容的新文件:

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

或者,您可以尝试手动导入键入。创建一个文件jszip.d.ts并粘贴its typings的所有内容。现在,删除最后一行export = JSZip;。文件结尾为:
declare var JSZip: JSZip;

那么,the package documentation中的代码应该可以工作。
全新项目的经典解决方案
在干净的目录中:
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 namespaces and ES6 modules together。您的代码导入一个模块,因此只需删除namespace program
关于ES6模块(包括模块名称空间对象)的更多文档here

10-04 22:21