我有一个用于另一个组件的简单组件ErrorBoundary。这两个组件均按流进行检查(即它们具有/* @flow */标志)。但是,如果我没有提供正确的道具而误用了ErrorBoundary,那么流程就不会捕获错误。这是ErrorBoundary

/* @flow */
import * as React from 'react';

type Props = {
  children: React.Node,
  ErrorComponent: React.ComponentType<any>,
};

type State = {
  hasError: boolean,
};

class ErrorBoundary extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);

    this.state = { hasError: false };
  }

  componentDidCatch(error: Error, info: string) {
    console.log(error, info); // eslint-disable-line
    this.setState({ hasError: true });
  }

  render() {
    const { ErrorComponent } = this.props;

    if (this.state.hasError) {
      return <ErrorComponent />;
    }

    return this.props.children;
  }
}

export default ErrorBoundary;


在这里它被滥用了:

/* @flow */
import * as React from 'react';
import ErrorBoundary from '/path/to/ErrorBoundary';

type Props = {};

class SomeComponent extends React.Component<Props> {
  render() {
    return (
      <ErrorBoundary>
        {..some markup}
      </ErrorBoundary>
    )
  }
}


尽管我没有为ErrorComponent提供必需的组件ErrorBoundary,但在运行流时它报告“没有错误!”。但是,如果我要从同一文件导入类型化的函数,则它可以工作。或者,如果我尝试在其自己的模块文件中错误地使用ErrorBoundary,那么flow也会捕获该错误。

这个问题似乎与导入使用流专门输入的React组件有关。有人知道我在做什么错吗?

最佳答案

问题是我的导入是通过与ErrorBoundary在同一目录中的中介index.js文件进行的。该index.js文件未标记// @flow标记。添加完之后,类型检查将正常工作。

09-10 12:17