Murat Karagöz在上面的回答中指出了正确的方向,而这个回答将提供实际代码,其中包含我们将使用declare
的最小示例。
这里是一个非常简单的npm模块:只有一个index.js
文件,其中导出了一个具有一个方法的对象。这里没有类型声明,因为它只是JS。
const item = {
price: 5,
name: 'item1',
};
export const MyModuleObject = { method: () => item };
这里是一个非常简单的TypeScript npm项目,只依赖于上面链接的JS项目。后者因此是一个没有类型定义的导入npm模块。以下是TS项目中的index.ts文件:
import { MyModuleObject } from 'npmModule';
import { LocalModuleObject } from './module';
MyModuleObject.test();
LocalModuleObject.test();
以下是
index.d.ts
的代码:
declare module "npmModule" {
export const Item: {
price: number,
name: string
}
export const MyModuleObject: {
method: () => Item
}
}
./module的代码:
export const LocalModuleObject = { method: () => 10 };
这是为什么要使用declare的一个例子:
- 我把这个放在了
index.ts
的注释中,但让我用更多的话来解释一下。
index.ts
正在从一个外部模块(在
node_modules
中)导入一个对象和从一个本地模块(
./module.js
)导入另一个对象。两个模块都导出一个对象,上面有一个名为
method
的方法。 在
index.ts
中,我在每个对象上调用了一个不存在的方法
test
。
TS在导入本地模块时使用上下文类型推断,因此它知道对象上不存在
test
。但是在导入外部模块的时候却没有这种情况:这个导入被导入为类型
any
。因此,TS不会对对不存在的方法
test
的调用进行投诉。然而,它会抱怨外部模块没有类型定义,这表明隐式的
any
正在被使用。
我们可以通过定义一个提供外部库类型定义的
index.d.ts
来解决后面的问题。这就是使用
declare module
的地方:它声明了模块
npmModule
导出的内容;
npmModule
是外部导入。在
index.ts
中,我们必须添加一行
/// <reference path="index.d.ts"/>
,以便TS知道在哪里查找类型。
noImplicitAny: true
to make ts complain, then fix the error bydeclare
- hackapedeclare
关键字的地方。我有遗漏什么吗? - chamdeclare
(该评论已经超过一年了)。但是在TypeScript自己网站的文档中提到了它。我的建议是去找源头。在这种情况下,declare
被明确提到这里。 - Heretic Monkey