繁体   English   中英

typescript 声明第三方模块

[英]typescript declare third party modules

我如何声明一个看起来像这样的第三方模块:

在第三方模块中:

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

在我的代码中:

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

查看有关使用第三方模块文档

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

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

TypeScript 2.7+的更新

使用添加的esModuleInterop编译器选项,您不再需要使用下面显示的“命名空间黑客”来查找具有非ES6兼容导出的CommonJS模块。

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

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

.d.ts文件中声明你的foo-example如下:

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

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

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

或者作为默认导入:

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

较旧的解决方法

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

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();

文档在声明文件各种 声明文件的一些模板 上有很好的资源

你声明了这个功能:

声明var foo:any;

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

我遇到了类似的问题。 并努力为我的项目添加类型定义。 最后我想到了。

这是一些模块(只有常量),我们称之为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/some-module/index.js创建具有相同文件夹结构的文件夹types并放置代码:

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

最后我可以在我的my-file.ts输入它my-file.ts

import { APPS } from 'some-module';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM