Как использовать аннотации машинописного текста jsdoc для React PropTypes

При определении компонентов реакции с помощью машинописного текста мы можем написать что-то вроде:

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

Есть ли способ сделать эквивалент, используя аннотации jsdoc и иметь реквизиты типовая проверка.


person lorefnon    schedule 03.05.2017    source источник
comment
Вы использовали встроенный React PropTypes?   -  person Andrew Li    schedule 03.05.2017
comment
@AluanHaddad Typescript недавно добавил поддержку проверки типов с помощью аннотаций jsdoc. Обратитесь по ссылке в вопросе.   -  person lorefnon    schedule 03.05.2017
comment
@AndrewLi Это устарело. И я бы предпочел, чтобы проверки происходили во время компиляции.   -  person lorefnon    schedule 03.05.2017
comment
@AluanHaddad Я намерен писать файлы .js, в которых не будет дженериков, а вместо этого будут комментарии jsdoc.   -  person lorefnon    schedule 03.05.2017
comment
Это с каких пор? Пробовали ли вы @property?   -  person Andrew Li    schedule 03.05.2017


Ответы (4)


Я предпочитаю следующую форму (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>
        );
    }

}
person artin    schedule 30.11.2017

В случае, если кто-то ищет альтернативное решение. Что касается этой проблемы с 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;
person datoml    schedule 26.09.2017
comment
Проверки времени выполнения PropTypes перепутаны со статическими проверками typescript. Я бы отказался от PropTypes, так как нет смысла использовать оба. - person artin; 30.11.2017

Это работает, хотя может быть и не так хорошо.

// 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
person kimamula    schedule 04.05.2017
comment
Спасибо за ответ. Это работает. Можете ли вы также предложить, как пометить передачу неуказанных реквизитов как ошибки? например. в вашем примере, если я вызову что-то вроде: <Foo a='a' b={0} c={20}/>, я не получаю никаких ошибок. - person lorefnon; 04.05.2017
comment
Хм, это странно. Я получаю сообщение об ошибке Property 'c' does not exist on type 'IntrinsicAttributes ..., когда я вызываю <Foo a='a' b={0} c={20}/> с помощью "compilerOptions": { "target": "es5", "allowJs": true, "checkJs": true, "jsx": "react" }. Я использую TypeScript 2.3.2. - person kimamula; 04.05.2017
comment
Я пытаюсь использовать все файлы как файлы js (включая тот, который его импортирует), а также // @ts-check. tsconfig: ` {compileOptions: { noEmit: true, allowJs: true, jsx: React, checkJs: true, allowJs: true }, include: [ ./src/ ] } ` - person lorefnon; 04.05.2017
comment
На самом деле, когда оба файла js, проверки типов вообще не происходит. - person lorefnon; 04.05.2017
comment
Я создал репозиторий на github, в котором проверка типов работает так, как ожидалось в (вероятно) такое же состояние, как у вас. - person kimamula; 04.05.2017
comment
ХОРОШО. Я не назначал const Foo и не экспортировал его. Это странно, но работает. Большое спасибо за помощь. - person lorefnon; 04.05.2017

Если вы используете 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

person gaurav5430    schedule 07.03.2021