我如何声明第三方模块,如下所示:
在第三方模块中:
module.exports = function foo(){
// do somthing
}
在我的代码中:
import * as foo from 'foo-module'; // Can not find a declaration module for ...
foo();
答案 0 :(得分:15)
查看documentation on working with 3rd party modules。
如何编写声明在很大程度上取决于模块的编写方式和导出的内容。
您提供的示例是CommonJS模块(module.exports = ...
),它实际上不是有效的ES6模块,因为ES6无法将函数导出为模块(它可以仅导出函数成员或默认函数)。
添加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 baseUrl
和typeRoots
{
...
"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';