我怎样才能声明一个第三方模块,它看起来像这样:

在第三方模块中:

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

在我的代码中:

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

推荐答案

看看documentation on working with 3rd party modules.

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

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

Update for TypeScript 2.7+

添加了esModuleInterop compiler option之后,对于具有非ES6兼容导出的CommonJS模块,您不再需要使用下面所示的"名称空间攻击".

首先,确保在tsconfig.json中启用了esModuleInterop(现在默认情况下包括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();

Older workaround

您可以在.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();

documentation has a good resource on declaration files和大约templates for various kinds of declaration files.

Typescript相关问答推荐

Tailwind CSS样式不在Svelte应用程序中呈现

类型脚本如何将嵌套的通用类型展开为父通用类型

当类型断言函数返回假时,TypScript正在推断从不类型

JS Redux Devtools扩展不工作

类型{}上不存在属性&STORE&A;-MobX&A;REACT&A;TYPE脚本

如何使用泛型自动推断TS中的类型

如何使用Zod使一个基于其他字段值的字段为必填字段?

类型脚本映射类型:从对象和字符串列表到键值对象

已解决:如何使用值类型限制泛型键?

如何使用Geojson模块和@Types/Geojson类型解析TypeScrip中的GeoJSON?

限制返回联合的TS函数的返回类型

在保留类型的同时进行深层键名转换

重载函数的T helper参数

Angular 自定义验证控件未获得表单值

回调函数中的TypeScrip类型保护返回Incorect类型保护(具有其他未定义类型的返回保护类型)

我的类型谓词函数不能像我预期的那样工作.需要帮助了解原因

如何为对象数组中的每个条目推断不同的泛型

可以';t使用t正确地索引对象;联合;索引类型

Select 器数组到映射器的Typescript 泛型

如何让 Promise 将它调用的重载函数的类型转发给它自己的调用者?