如何在Typescript 2.0项目中使用外部库?

时间:2016-10-07 17:06:01

标签: angular typescript typescript-typings filesaver.js

我有一个使用Common JS模块和System JS加载器的Typescript 2.0项目。我使用Visual Studio代码作为IDE。我在项目中使用外部库(filesaver JS)时遇到问题。

我通过npm安装了librarytype definition。两者都分别出现在我的node_modules和node_module / @类型中。

如何在我的函数中引用(导入)我的TypeScript代码中的filesaver saveAs函数来保存blob(转换为JSON字符串的对象)?

我尝试了几种导入方式,但它们似乎都不适用于我。我得到'index.d.ts'不是模块错误,或'模块未找到'错误。

以下是我的尝试:

import filesaver = require('FileSaver'); //error: index.d.ts is not a module import {FileSaver} from 'file-saver'; //error: cannot find module file-saver

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "commonjs",
    "declaration": false,
    "removeComments": true,
    "noLib": false,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "lib": ["es6", "es2015", "dom"],
    "sourceMap": true,
    "pretty": true,
    "allowUnreachableCode": false,
    "allowUnusedLabels": false,
    "noImplicitAny": true,
    "noImplicitReturns": true,
    "noImplicitUseStrict": false,
    "noFallthroughCasesInSwitch": true,
    "typeRoots": [
      "./node_modules/@types",
      "./node_modules"
    ],
    "types": [
      "node"
    ]
  },
  "exclude": [
    "node_modules",
    "dist",
    "src"
  ],
  "compileOnSave": false
}

2 个答案:

答案 0 :(得分:2)

我在使用System JS模块加载器的Angular 2项目中遇到了同样的问题。 对我来说

k = dict((key, dictionary[key]) for key in i)

工作,但只有在我明确地将文件保护程序的模块格式设置为System JS配置中的cjs之后:

import {saveAs} from 'file-saver';

据我所知,SystemJS默认将文件保护程序识别为AMD模块。也许在文件保护程序中AMD模块定义有问题,但我对此并不十分了解。 (另见https://github.com/eligrey/FileSaver.js/blob/master/FileSaver.js#L182

答案 1 :(得分:0)

这可能不是完美的解决方案,但以下三行适用于IE 11和Chrome。

var saveAs = require('file-saver');
var blob = new Blob([JSON.stringify(myDataObject)], { type: 'text/plain;charset=utf-8' });
saveAs(blob, "file.txt");