TypeScript 与'export * as namespace...'合并的汇出型别只会汇出型别意义,

kuhbmx9i  于 2022-10-29  发布在  TypeScript
关注(0)|答案(2)|浏览(126)

以前,我喜欢使用TS名称空间和声明合并来创建FP样式的模块,而不需要MyModule.T约定:

export type Foobar = { }

export namespace Foobar {
  export function doStuff(foobar: Foobar) { }
}
import { Foobar } from './Foobar'

Foobar.doStuff(fb)

名称空间不再是真正的方法,Babel不支持它们,它们可能不支持树摇动等等。但是我希望export * as ns语法可以〉用作替代,如下所示:

export type Foobar = import('./Foobar').Foobar

// Or:
// export type { Foobar } from './Foobar'

export * as Foobar from './Foobar'

这似乎通过了夜间编译器,但编译器只知道Foobar是作为一个类型而不是值重新导出的。如果编译器能像命名空间那样将它们合并成一个组合的值和类型,那就太好了。

  • 最初由@katis发布于#4813(评论)*
qxgroojn

qxgroojn1#

我们有一些项目/模块大量使用了这种模式。尽管我们需要改变,但墙上的文字已经写好了:

  • 不摇树支架
  • 默认情况下的eslint警告
  • 不支持像模块一样的再导出/桶导出(也称为. TS命名空间,因为引入后没有跟上模块命名空间的步伐)

我想我对这个问题没有太多要补充的,它描述得很好,我们的用例也很相似。我只是希望我能+1000它:)

k97glaaz

k97glaaz2#

我的情况也一样:

export * from './types/index.js';

export {
  RequestContext,
  ResponsePayload,
};

里答:

import { RequestContext,  } from '@ns/package';

仅选项:RequestContextResponsePayload,没有任何类型,但它在运行时工作。
types/index.js为:

// ...
export * from './client-error/index.js';
export * from './server-error/index.js';

export {
  GenericHttpError,
};

相关问题