Reactjs 在构造函数中声明从不使用的React props的正确方法

Reactjs 在构造函数中声明从不使用的React props的正确方法,reactjs,typescript,constructor,Reactjs,Typescript,Constructor,通常,当我在构造函数中不使用道具时,我可以安全地将其保留为空白 constructor() { super() } 但是TypeScript需要您定义它。如果我不使用它,我一直在做这样的事情: constructor(_: never) { super(_) } 是否有一种正确和/或更正式的方式来声明您从未使用过的参数?为了清晰和正确的类型,我会将参数的常用名称命名为props。声称它是never类型是不准确的,因为never是没有值的类型,并且在运行时肯定会将值传递给构造函

通常,当我在
构造函数中不使用
道具时,我可以安全地将其保留为空白

constructor() {
    super()
}
但是TypeScript需要您定义它。如果我不使用它,我一直在做这样的事情:

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

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

为了清晰和正确的类型,我会将参数的常用名称命名为
props
。声称它是
never
类型是不准确的,因为
never
是没有值的类型,并且在运行时肯定会将值传递给构造函数;不幸的是,
从不
不会根据TypeScript处理JSX元素的特定方式导致编译错误。

函数参数以避免编译错误<代码>.
名称具有误导性,因为它不包含信息,如果包含更多信息,则会与其他属性名称冲突。由于属性用作
super
参数,因此不需要下划线

never
在这里不是正确的类型,因为这意味着。它可能与父构造函数参数类型冲突

  constructor(...args) {
    super(...args);
    // ...
  }
在JavaScript中这是一种正确的方法,但在TypeScript
super
中,如果参数是必需的,则应显式指定参数。这样的显式构造函数可以省略,因为在默认情况下,当未指定
构造函数时,会执行此操作

在React组件中很少需要显式构造函数。唯一有效的
super
属性是
props
。大多数初始化代码都指向组件生命周期挂钩(不推荐是唯一的例外),而实例属性可以在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 });
  }
  ...
}