【发布时间】:2019-07-10 03:22:32
【问题描述】:
我正在尝试扩充convict 的types。目前定义导出 convict 使用:
namespace convict { ... }
interface convict { ... }
declare var convict: convict;
export = convict;
所以我扩充了界面(./types/convict/index.d.ts):
declare module 'convict' {
interface convict {
<T>(
config: convict.Schema<T> | string,
options?: { env: Record<string, string> }
): convict.Config<T>;
}
}
但是在导入默认导出convict 时不会选择此接口。这似乎是由export = convict 和declare var convict: convict 引起的。不过我可以直接导入增强接口:
// Default import fails - same interface as @types/convict
import convict from 'convict';
// Import interface directly is ok - convict interface is augmented
import { convict } from 'convict';
谁能帮我理解为什么export = convict 和declare var convict: convict 忽略了增强界面?
【问题讨论】:
-
由于模块使用了导出赋值,除非它提供了一些扩充点(如
express所做的),否则您无法真正扩充它。通过导出分配,模块中的内容基本上是私有的,只有导出标识符中的内容是公开的。所以你不能增加你看不到的东西。 -
感谢您的帮助,这是有道理的。关于明确的扩充点,您是指
declare global {}内部的声明吗? -
是的,正是这些,因为它们在全局命名空间中,它们可以被扩充。
标签: typescript