如何使用 React PropTypes 的 typescript jsdoc 注释

问题描述 投票:0回答:5

当使用 typescript 定义 React 组件时,我们可以这样写:

class SomeComponent extends React.Component<PropInterface, StateInterface> {
  // ...
}

有没有办法使用 jsdoc 注释 进行等效操作并进行 props 类型检查。

javascript typescript jsdoc
5个回答
35
投票

我更喜欢以下形式(es2015 + @types/react):

/**
 * @typedef {object} Props
 * @prop {string} className
 * @prop {number} numberProp
 *
 * @extends {Component<Props>}
 */
export default class SomeComponent extends Component {
    render() {
        return (
            <div className={this.props.className}>
                {this.props.numberProp}
            </div>
        );
    }

}

5
投票

以防有人正在寻找替代解决方案。 关于这个Typescript问题你也可以这样实现

import React, { Component } from 'react';
import PropTypes from 'prop-types';

/**
 * @augments {Component<{onSubmit:function, text:string}>}
 * @param {object} event - Input event
 * @return {React.ReactElement} - React component
*/
class Test extends Component {
  handleInput = (event) => {
    event.preventDefault();
    this.props.onSubmit(event.target.value);
  };

  render() {
    const { text } = this.props;
    return <div>Hello, property :O {text}</div>;
  }
}

Test.propTypes = {
  onSubmit: PropTypes.func.isRequired,
  text: PropTypes.string.isRequired,
};

export default Test;

4
投票

这可行,尽管可能不太好。

// Foo.jsx
import * as React from 'react';

/**
 * @type {{ new(props: any): {
     props: { a: string, b: number },
     state: any,
     context: any,
     refs: any,
     render: any,
     setState: any,
     forceUpdate: any
   } }}
 */
const Foo = class Foo extends React.Component {
  render() {
    return <div className={this.props.a}>{this.props.b}</div>;
  }
};
export default Foo;

// import Foo and use it in .tsx or .jsx file
import Foo from './Foo';

<Foo/>; // error: Type '{}' is not assignable to type '{ a: string; b: number; }'
<Foo a='a' b={0}/>; // OK

2
投票

如果您使用 PropTypes,

这样的东西对我有用:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

/**
 * Test component
 * @augments {Component<Props, State>}
 */
class Test extends React.Component {
  // ...
}

Test.propTypes = {
  title: PropTypes.string.isRequired,
}

export default class Test1 extends React.Component {
  render() {
    return <Test  />
  }
}

vscode proptypes intellisense


0
投票

这是一种使用 JSDoc 启用 propType 类型的工作方法

import React, { PureComponent } from "react";
import PropTypes from "prop-types";

/**
 * @extends {PureComponent<PropTypes.InferProps<SomeComponent.propTypes>>}
 */
class SomeComponent extends PureComponent {
  // ...
}
© www.soinside.com 2019 - 2024. All rights reserved.