代码之家  ›  专栏  ›  技术社区  ›  o01

Typescript中带点符号的多个导出

  •  1
  • o01  · 技术社区  · 8 年前

    参考号:。 this question

    我正试图做完全相同的事情,但使用Typescript。

    问题

    此行(在export语句之前):

    Sidebar.Item = SidebarItem;
    

    给出编译错误: Property 'Item' does not exist on type 'typeof Sidebar'

    尝试的解决方案1

    我尝试将项添加到侧栏类定义中,如下所示:

    class Sidebar extends Component<SidebarProps, SidebarState> {
        Item: SidebarItem;
        ...
    }
    

    但这会导致以下错误: Public property 'Item' of exported class has or is using private name 'SidebarItem'.

    尝试的解决方案2

    我已尝试删除此行:

    侧栏。项目=SidebarItem;
    

    而不是将项添加到我的类定义中,而是像这样导出这两个类:

    export default Sidebar;
    export { SidebarItem as Item };
    

    它可以编译,我可以像这样导入所有内容:

    import * as Sidebar from '...';
    

    但我必须这样使用它们:

    <Sidebar.default>
        <Sidebar.Item></Sidebar.Item>
        <Sidebar.Item></Sidebar.Item>
    </Sidebar.default>
    

    我真的很想摆脱它 .default 在里面 Sidebar

    我做错了什么?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Oblosys    8 年前

    您的第一个解决方案几乎是正确的,但您声明 Item 作为 Sidebar 类,而不是类本身。您可以通过静态属性声明来实现后者。这应该可以:

    export class SidebarItem ..
    ..
    class Sidebar extends Component<SidebarProps, SidebarState> {
      static Item = SidebarItem;
    ..
    export default Sidebar;
    

    你不需要排队 Sidebar.Item = SidebarItem; 还有,但你可能需要移动 SidebarItem 类,使其出现在 侧边栏 。导入将只是 import Sidebar from '...'

        2
  •  1
  •   Estus Flask    8 年前

    该模块在设计上有缺陷。

    可以通过以下方式完成:

    export class SidebarItem ...
    
    export default class Sidebar extends Component<SidebarProps, SidebarState> {
        static Item = SidebarItem;
        ...
    }
    

    这两个组件为什么要保持这样的层次结构,这是没有充分理由的。

    这是惯例 骆驼壳 如果有多个相等值的导出(哪些组件是),则使用单独的命名导出。命名导出更适合在IDE中自动导入:

    export { Sidebar, SidebarItem };
    

    Item 需要时,无法从默认导出中摇动树。 Sidebar.Item 缩小效率低于 SidebarItem