打字稿声明第三方模块

时间:2017-05-18 21:32:08

标签: javascript typescript declare

我如何声明第三方模块,如下所示:

在第三方模块中:

module.exports = function foo(){
  // do somthing
}

在我的代码中:

import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();

3 个答案:

答案 0 :(得分:15)

查看documentation on working with 3rd party modules

如何编写声明在很大程度上取决于模块的编写方式和导出的内容。

您提供的示例是CommonJS模块(module.exports = ...),它实际上不是有效的ES6模块,因为ES6无法将函数导出为模块(它可以仅导出函数成员或默认函数)。

TypeScript 2.7 +

的更新

添加esModuleInterop compiler option后,您不再需要使用"命名空间hack"下面显示了具有非ES6兼容导出的CommonJS模块。

首先,请确保您esModuleInterop中已启用tsconfig.json(现在默认包含tsc --init):

{
  "compilerOptions" {
    ...
    "esModuleInterop": true,
    ...
   }
}

foo-example文件中声明您的.d.ts,如下所示:

declare module "foo-module" {
  function foo(): void; 
  export = foo;
}

现在您可以将其导入为您想要的命名空间:

import * as foo from "foo-module";
foo();

或者作为默认导入:

import foo from "foo-module";
foo();

较旧的解决方法

您可以在foo-example文件中声明.d.ts,如下所示:

declare module "foo-module" {
  function foo(): void; 
  namespace foo { } // This is a hack to allow ES6 wildcard imports
  export = foo;
}

按照您的意愿导入:

import * as foo from "foo-module";
foo();

或者像这样:

import foo = require("foo-module");
foo();

documentation has a good resource on declaration files和一些templates for various kinds of declaration files

答案 1 :(得分:0)

您声明该功能:

声明var foo:any;

这将告诉Typescript,你有一个名为foo的函数,你将确保在网站上注入。

答案 2 :(得分:0)

我有类似的问题。并努力为我的项目添加类型定义。终于我想到了。

这是一些模块(仅包含常量),我们称之为some-module-node_modules / some-module / index.js。

'use strict';

exports.__esModule = true;
var APPS = exports.APPS = {
    ona: 'ona',
    tacq: 'tacq',
    inetAcq: 'inetAcq'
};

首先,我将tsconfig.json baseUrltypeRoots

添加到
{
  ...
  "compilerOptions": {
    ...
    "baseUrl": "types",
    "typeRoots": ["types"]
  }
  ...
}

第二个,在我的项目根目录中,创建文件夹types,该文件夹具有与模块types/some-module/index.js相同的文件夹结构,并放置代码:

declare module 'some-module' {
    type Apps =  {
        ona: string;
        tacq: string;
        inetAcq: string;
    };
    let APPS: Apps
}

最后,我可以通过输入将其导入my-file.ts中!

import { APPS } from 'some-module';