typescript - 如何在模块声明中重新导出命名空间定义

标签 typescript types lodash typescript-typings

首先,我想了解为什么某些 TypeScript 定义文件以两种形式给出(我将尝试通过 lodash 示例来说明这一点)。

第一个是“基于命名空间”(来自 @types/lodash 定义):

export = _;
export as namespace _;
declare var _: _.LoDashStatic;
declare namespace {
    (...)
}

第二个是“基于模块”(来自 typings 模块定义):
declare module 'lodash' {
    var _: _.LoDashStatic;
    namespace _ {
        (...)
    }
    export = _;
}

同一个库的两个定义源显示了不同的方法。这里的权衡是什么以及为什么 @types/... 中的一些类型来源在第一个有利于第二个?

我在将“基于命名空间”的定义与位于我的项目范围之外的共享代码一起使用时遇到了一些问题,因此我更喜欢“基于模块”的定义。
好了,第二步来了。我想标准化这些定义并且只使用 @types/... source 但是当我得到“基于命名空间”的定义(如 lodash )时,我想编写一些自定义定义(尽可能短),以“基于模块”的方式重新导出该命名空间。

我试过这样的事情:
declare module "lodash" {
    import * as x from "lodash";

    var _: x.LoDashStatic;
    namespace _ {}
    export = _;
}

这当然不起作用(除了没有 cannot find module... 错误之外),但我认为这几乎表明了我在这里想要完成的事情。
我的目标是使用 @types/lodash/index.d.ts 中声明的命名空间并使用模块声明将其导出到不同的文件中(如 custom_typings/lodash.d.ts )。

总结起来有两个问题:
  • 为什么定义以两种不同的方式构建?
  • 如何简单地将一种方法转换为另一种方法?
  • 最佳答案

    经过这么多时间寻找解决方案,我终于让它工作了!

    /** index.d.ts */
    import './models';
    
    // tslint:disable-next-line:no-namespace
    declare namespace MyLib {
        export interface A {
            // ...
        }
    
        // ...
    }
    
    
    /** extra.d.ts */
    // tslint:disable-next-line:no-module
    declare module './index' {
        export interface B {
            // ...
        }
    
        // ...
    }
    
    两个A & B然后作为 MyLib 的一部分可供消费者访问命名空间。
    此外,您可以正常访问 Bindex.d.ts 中定义的命名空间范围内.
    我同意语法不是很好,但它确实有用。
    lodash 类型中使用了类似的方法:
  • https://unpkg.com/browse/@types/lodash@4.14.157/ts3.1/index.d.ts
  • https://unpkg.com/browse/@types/lodash@4.14.157/ts3.1/common/common.d.ts

  • 在我上面的 POC 中,我更喜欢使用 es6 import语法,lodash 类型使用 /// <reference .这两个选项都有效,因此由您决定。

    关于typescript - 如何在模块声明中重新导出命名空间定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41789096/

    相关文章:

    python - 如何根据数据类型在 python 中设置条件?

    javascript - 编写一个函数来迭代并提取内部数组的对象

    python - 检查两个列表是否按类型 Python 相等

    typescript - Vuejs vue-property-decorator 数据字段声明

    javascript - Angular 2+ |如何在 NgModule 中使用参数定义路由

    typescript - 为什么我需要在 Typescript 中输入 cast?

    java - 按参数类型?

    javascript - 有没有类似 lodash _.toArray for ramda.js 的东西?

    javascript - 在 Javascript 中排序列表

    angular - 订阅不存在类型 'Subscription'