用 TypeScript 和 Redux 懒惰地反应

Ann*_*nen 5 javascript lazy-loading typescript reactjs

我在将 React lazy 与我使用 TypeScript 和 Redux 的项目相结合时遇到了问题。这是我的代码:

// lazy-area.tsx
const LazyArea = ({text}: Props): JSX.Element => {
    ....
};

export const LazyArea = connect(
mapStateToProps,
mapDispatchToProps
)(LazyArea);


//Menu.tsx
import React, { lazy, Suspense } from 'react';
....
const lazyArea = lazy(() => import('./lazy-area'));

const Menu = ({
    .....
  }: Props): JSX.Element | null => {
      return (
        <Suspense fallback={LoadingView}>
            <LazyArea />
        </Suspense>
      )
    export const Menu = connect(
    mapStateToProps,
    mapDispatchToProps
    )(Menu);
});
Run Code Online (Sandbox Code Playgroud)

通过此设置,我收到一条错误消息:

Type 'Promise<typeof import("/home/user/app/lazy-area")>' is not assignable to type 'Promise<{ default: ComponentType<any>; }>'.
  Property 'default' is missing in type 'typeof import("/home/user/app/src/lazy-area")' but required in type '{ default: ComponentType<any>; }'.
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下解决方案: TypeScript with React Lazy 获得了 要添加export as ComponentType<any>export as React.FC到 LazyArea 导出的承诺错误,但错误保持不变。

提供的解决方案 在这里 消除了错误,但根据解决方案是不是高清的最佳实践和“可能会杀死优化,并可能导致无限循环”。

在 LazyArea 中使用导出默认值时,此错误也会消失:

const LazyArea = connect(
mapStateToProps,
mapDispatchToProps
)(LazyArea);

export default LazyArea;
Run Code Online (Sandbox Code Playgroud)

但是,我从一些来源读到应该避免使用导出默认值。

有什么好的解决方案可以解决这个问题吗?如果我提供的关于某事的信息太少,请告知。谢谢 :)

JLa*_*rky 2

我不知道为什么您认为应该避免使用默认导出:)我认为这只是一些团队的约定。所以添加export default LazyArea;是处理这个问题的有效方法。无论如何,你不会有太多的惰性模块。

这就是为什么React 文档中的解决方案也可以在您只需将默认导出放入其自己的文件中的情况下工作。

另一种推荐的方法是更改​​导入代码以将其转换为默认内联:

const LazyArea = React.lazy(() =>
  import("./lazy-area").then((module) => ({
    default: module.LazyArea,
  }))
);
Run Code Online (Sandbox Code Playgroud)

但这对我来说似乎工作太多了:)所以我创建了react-lazyly,它可以满足您的期望。

例子

const { LazyArea } = lazily(() => import('./lazy-area'));
Run Code Online (Sandbox Code Playgroud)

它只是一个小包装React.lazy,但它允许您拥有一个非常直接的代码,如下所示:

import { lazily } from 'react-lazily';
const { Component1, Component2 } = lazily(() => import('./Components'))
Run Code Online (Sandbox Code Playgroud)