如何为 React PropTypes 使用 typescript jsdoc 注释
How to use typescript jsdoc annotations for React PropTypes
当使用 typescript 定义 React 组件时,我们可以这样写:
class SomeComponent extends React.Component<PropInterface, StateInterface> {
// ...
}
有没有一种方法可以使用 jsdoc annotations 进行等效操作并检查 props 类型。
虽然效果可能不是很好。
// 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
以防有人正在寻找替代解决方案。
关于这个Typescript issue你也可以这样实现
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;
我更喜欢以下形式 (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>
);
}
}
如果您使用 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 />
}
}
当使用 typescript 定义 React 组件时,我们可以这样写:
class SomeComponent extends React.Component<PropInterface, StateInterface> {
// ...
}
有没有一种方法可以使用 jsdoc annotations 进行等效操作并检查 props 类型。
虽然效果可能不是很好。
// 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
以防有人正在寻找替代解决方案。 关于这个Typescript issue你也可以这样实现
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;
我更喜欢以下形式 (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>
);
}
}
如果您使用 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 />
}
}