在从未使用过的构造函数中声明React道具的正确方法

时间:2018-08-28 00:41:27

标签: reactjs typescript constructor

通常,当我不在props中使用construtor时,可以放心地将其保留为空白

constructor() {
    super()
}

但是TypeScript要求您定义它。如果我不使用它,那么我一直在做这样的事情:

constructor(_: never) {
    super(_)
}

是否有正确和/或更正式的方式声明您从未使用过的参数?

2 个答案:

答案 0 :(得分:2)

函数参数can be underscored in TypeScript if they aren't used以避免编译错误。 _名称具有误导性,因为它不包含信息,如果有更多的名称,它将与其他属性名称冲突。由于属性用作super参数,因此不需要强调。

never在这里不是正确的类型,因为这意味着something else rather than a property that is never used。可能与父构造函数参数类型冲突。

  constructor(...args) {
    super(...args);
    // ...
  }

将是在JavaScript中执行此操作的正确方法,但是如果是必需的,则应在TypeScript super中明确指定参数。这样的显式构造函数可以省略,因为默认情况下在未指定constructor的情况下会这样做。

在React组件中很少需要显式构造函数。有效的唯一super属性是props。大多数初始化代码用于组件生命周期挂钩(不推荐使用componentWillMount是唯一的例外),而实例属性可以在TypeScript中声明为类字段:

class SomeComponent extends React.Component {
  state = {
    foo: synchronousInitialization();
  };

  // isn't needed
  /*
  constructor(props) {
    super(props);
  }
  */

  async componentDidMount() {
    const bar = await asynchronousInitialization();
    this.setState({ ...this.state, bar });
  }
  ...
}

答案 1 :(得分:1)

为清楚起见和正确的类型,我将为参数指定其惯用名称props。声称其类型为never是不准确的,因为never是没有值的类型,并且值肯定在运行时传递给构造函数;不幸的是,never不会基于TypeScript处理JSX元素的特定方式而导致编译错误。