扩展和重新导出导入的 TypeScript 命名空间

Extending and reexporting an imported TypeScript namespace

提问人:Isti115 提问时间:6/29/2023 最后编辑:Isti115 更新时间:6/29/2023 访问量:61

问:

在我们的一个项目中,我们正在导入一个包,该包导出了一堆颜色值,我们希望扩展和重新导出这些值。到目前为止,这已经是用普通的旧 JS 对象完成的:

theme-library/colors.js:

export const Colors = {
  error: '#f00',
  info: '#00f',
  success: '#0f0',

  axes: {
    x: '#f44',
    y: '#4f4',
    z: '#06f',
  },
};

app/colors.js:

import { Colors as BaseColors } from 'theme-library/colors';

export const Colors = {
  ...BaseColors,

  done: '#0f8',
  selected: '#fc0',
};

现在我们正在过渡到 TypeScript,我们认为将它们转换为命名空间是正确的选择,如下所示,它在库中工作:

theme-library/colors.ts:

export namespace Colors {
  export const error = '#f00';
  export const info = '#00f';
  export const success = '#0f0';

  export const axes = {
    x: '#f44',
    y: '#4f4',
    z: '#06f',
  } as const;
}

但是,我们不知道在应用程序源代码中扩展这些值的正确方法是什么。传播是无效的,我似乎无法弄清楚是否有其他可行的方法可以将一个命名空间的所有成员包含在另一个命名空间中。由于我不介意扩展原始命名空间而不是创建一个新命名空间,因此我也考虑过合并命名空间,只需使用其原始名称导入并创建另一个具有相同名称的命名空间,但它似乎不起作用。(Colors"Import declaration conflicts with local declaration of 'Colors'.)

app/colors.ts:

import { Colors as BaseColors } from 'theme-library/colors';

export namespace Colors {
  // None of these work:
  // ...BaseColors;
  // export * from BaseColors;
  // export { Colors } from 'theme-library/colors';

  export const done = '#0f8';
  export const selected = '#fc0';
};

我试过四处阅读,据我所知,这似乎是不可能的,但请告诉我我的结论是否错误!如果这确实不可行,那么我会对我们可以采取的替代方法感兴趣!

TypeScript 命名空间

评论

0赞 Asplund 6/29/2023
为什么不直接导出?Colorsexport const Colors = { ... } as const
0赞 Isti115 6/29/2023
我也在考虑退回到一个常规对象。也许这根本不是命名空间的正确用途?🤔
0赞 Asplund 6/29/2023
我个人不鼓励在非声明文件中使用命名空间。它们通常不是必需的。它们可用于声明公开全局构造函数的非类型化代码。在你的情况下,一个普通的对象就足够了,你可以保持智能感知并防止突变。如果要为对象创建类型,可以使用as const{...} satisfies ColorsType

答:

0赞 Dimava 6/29/2023 #1

您可以用作命名空间:export

// a.ts
export const red = '#f00'
export const blue = '#00f'
// b.ts
export * from './a.ts'
export const blurple = '#40f'
// c.ts
export * as Colors from './b.ts'
// use.ts
import * as Colors1 from './b.ts'
import {Colors} from './c.ts'