【问题标题】:Augmenting external interface扩展外部接口
【发布时间】:2019-07-10 03:22:32
【问题描述】:

我正在尝试扩充convicttypes。目前定义导出 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 = convictdeclare 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 = convictdeclare var convict: convict 忽略了增强界面?

【问题讨论】:

  • 由于模块使用了导出赋值,除非它提供了一些扩充点(如express 所做的),否则您无法真正扩充它。通过导出分配,模块中的内容基本上是私有的,只有导出标识符中的内容是公开的。所以你不能增加你看不到的东西。
  • 感谢您的帮助,这是有道理的。关于明确的扩充点,您是指declare global {}内部的声明吗?
  • 是的,正是这些,因为它们在全局命名空间中,它们可以被扩充。

标签: typescript


【解决方案1】:

根据Titian's comment,这是不可能的,因为导出分配将可见性限制为仅导出的声明 - 其他声明是私有的,因此无法扩充。

【讨论】:

    猜你喜欢
    • 2011-10-06
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2023-04-08
    • 1970-01-01
    相关资源
    最近更新 更多