【问题标题】:TypeScript default constant exportTypeScript 默认常量导出
【发布时间】:2017-02-01 04:47:36
【问题描述】:

我们有一个 TypeScript 库,要发布到私有 NPM 环境,我们希望在其他 TS、ES6 或 ES5 项目中使用该库。

让库是一个名为foo的npm包,它的主文件就像一个桶,执行以下操作:

// Index.ts
import Foo from './Core/Foo';

export {default as Foo} from './Core/Foo';

const foo = new Foo();

export default foo;

我们希望导出主库类以及默认实例以供应用使用,除非必要,否则无需创建新实例。

此外,我们在单独的存储库中创建了类型定义文件,方法与DefiniteTyped 类似:

// foo.d.ts
declare namespace Foo {
  export class Foo {
    public constructor()
    // ...methods
  }

  const foo: Foo;

  export default foo;
}

declare module 'foo' {
  export = Foo;
}

对其运行测试失败并显示error TS1063: An export assignment cannot be used in a namespace.

我的目标是像这样使用默认实例:

// ES5, browser env
window.Foo.foo.someMethod();

// ES6/TS
import foo from 'foo';

foo.someMethod();

如果有正确的方法可以做到这一点,有什么想法吗?

编辑

像@daniel-rosenwasser 建议的那样只声明模块之前是可行的,但是当我们尝试创建一个扩展第一个模块的新模块时出现了问题。

例如:

// bar.d.ts
/// <reference path="../foo/foo.d.ts"/>

import {
  Foo
} from 'foo';

declare module 'bar' {
  export class Bar extends Foo {
    public constructor();
    // more methods
  }
}

及其测试:

// bar-tests.ts
/// <reference path="../foo/foo.d.ts"/>
/// <reference path="./bar.d.ts"/>

import foo, {
  Foo
} from 'foo';

import {
  Bar
} from 'bar';

namespace TestBar {
  {
    let result: Foo;
    result = foo;
  }

  {
    let result: Foo;
    result = new Bar();
  }
}

这次的错误是:

bar/bar-tests.ts: error TS2307: Cannot find module 'bar'.
bar/bar.d.ts: error TS2664: Invalid module name in augmentation, module 'bar' cannot be found.

【问题讨论】:

标签: typescript typescript1.8 typescript-typings


【解决方案1】:

这里的错误信息是错误的,所以我为你打开了一个问题:https://github.com/Microsoft/TypeScript/issues/11092

如果你有一个 ES 风格的模块,你应该直接在环境模块声明中定义它:

declare module "foo" {
    export class Foo {
        public constructor()
        // ...methods
    }

    const foo: Foo;

    export default foo;
}

【讨论】:

  • 是的,这和我以前的差不多,但是后来当我尝试创建一个扩展这个模块的新模块时问题出现了,将示例添加到问题中......
  • 在另一个模块中时,declare module "foo" {} 语法会创建一个模块扩充。你在另一个模块中的原因是你有一个顶级导入。您可以将导入 移入 declare module "bar"` 以使其正常工作。
  • 这成功了!我没有意识到 import 语句应该放在模块声明中,谢谢 Daniel!
猜你喜欢
  • 2017-11-12
  • 2020-04-30
  • 2022-12-07
  • 2021-06-01
  • 1970-01-01
  • 2021-04-11
  • 1970-01-01
  • 2016-07-15
  • 2019-04-02
相关资源
最近更新 更多