PropTypes у застосуванні TypeScript React


121

Чи React.PropTypesмає сенс використання в програмі TypeScript React або це лише випадок "поясів і підтяжок"?

Оскільки клас компонента оголошено Propsпараметром типу:

interface Props {
    // ...
}
export class MyComponent extends React.Component<Props, any> { ... }

чи є реальна користь від додавання

static propTypes {
    myProp: React.PropTypes.string
}

до визначення класу?

Відповіді:


104

Зазвичай для підтримки обох компонентних реквізитів типу TypeScript зазвичай не так багато, і React.PropTypesодночасно.

Ось кілька випадків, коли це корисно зробити:

  • Публікація такого пакета, як бібліотека компонентів, який буде використовуватися звичайним JavaScript.
  • Прийняття та передача зовнішнього входу, наприклад результатів виклику API.
  • Використання даних з бібліотеки, яка може не мати адекватних або точних типізацій, якщо такі є.

Отже, зазвичай це питання про те, наскільки ви можете довірити вашій увазі перевірку часу компіляції.

Новіші версії TypeScript тепер можуть виводити типи на основі вашого React.PropTypes( PropTypes.InferProps), але отримані типи можуть бути важкими для використання або посилатися на інші місця вашого коду.


1
Не могли б ви пояснити перше твердження?
Vehsakul

2
@vehsakul Вибачте, для уточнення, якщо ви пишете пакет, який буде встановлений розробниками, які не використовують TypeScript, вони все ще потребують PropTypes, щоб отримати помилки під час виконання. Якщо ваш проект призначений лише для вас / інших проектів TypeScript, інтерфейсів TypeScript для вашої реквізиту достатньо, оскільки проект просто не будується.
Joel Day

1
Це POC, який додає PropTypes з інтерфейсів машинопису на рівні Webpack github.com/grncdr/ts-react-loader#what-it-does
borN_free

Я хочу oneOfType - optionalUnion: PropTypes.oneOfType ([PropTypes.string, PropTypes.number, PropTypes.instanOf (повідомлення)]), - typecript має типи об'єднання, але вони не зовсім дають мені те саме
Mz

1
Я опублікував бібліотеку, яка також робить це: github.com/joelday/ts-proptypes-transformer Це реалізовано як перетворення компілятора TypeScript, і вона створює точні propTypes для глибоких generics, об'єднань тощо. будь-які внески були б чудовими.
День Джоела

141

Typescript і PropTypes служать різним цілям. Typescript перевіряє типи під час компіляції , тоді як PropTypes перевіряються під час виконання .

Typescript корисний під час написання коду: він попередить вас, якщо ви передасте аргумент неправильного типу компонентам React, дасть вам автозаповнення для викликів функцій тощо.

PropTypes корисні, коли ви перевіряєте, як компоненти взаємодіють із зовнішніми даними, наприклад, коли ви завантажуєте JSON з API. PropTypes допоможе вам налагоджувати (у режимі розвитку React), чому ваш компонент виходить з ладу, друкуючи корисні повідомлення типу:

Warning: Failed prop type: Invalid prop `id` of type `number` supplied to `Table`, expected `string`

Хоча може здатися, що Typescript і PropTypes роблять те саме, вони насправді взагалі не перетинаються. Але можливо автоматично генерувати PropTypes з Typescript, так що вам не доведеться вказувати типи двічі, див. Наприклад:


1
Чи легко типи propTypes та Typescript виходять із синхронізації? Хто-небудь мав досвід технічного обслуговування, щоб сказати нам?
Леонардо

9
Це правильна відповідь! PropTypes (час виконання) не збігаються з статичною типовою перевіркою (час компіляції). Отже, використання обох не є "безглуздою вправою".
Хан

1
Ось приємне пояснення того, як статичні типи можна зробити з PropTypes: dev.to/busypeoples/…
hans

Час виконання та компіляції не має сенсу, коли у вас є vue cli з гарячим перезавантаженням та eslint. Що створює помилки при збереженні.
Юлія

1
@Julia, гаряче перезавантаження не має нічого спільного з часом виконання. Навіть при гарячому перезавантаженні у вас не буде поняття, що насправді поверне api
Костя Тресько

4

Я думаю, що в деяких безладних ситуаціях, коли тип реквізиту неможливо зробити під час компіляції, тоді було б корисно побачити будь-які попередження, створені в результаті використання propTypesпід час виконання.

Однією з таких ситуацій була б обробка даних із зовнішнього джерела, для якого не доступні визначення типу, наприклад, зовнішній API, який не є вашим контролем. Щодо внутрішніх API, я вважаю, що варто докласти зусиль, щоб написати (або краще, створити) визначення типів, якщо вони ще не доступні.

Крім цього, я не бачу ніякої користі (чому я ніколи не використовував її особисто).


7
Перевірка PropTypes також має сенс перевірити структуру даних, завантажену динамічно (з сервера через AJAX). PropTypes - це перевірка часу виконання, і, таким чином, справді може допомогти налагоджувати матеріали. Оскільки проблеми будуть виводити чіткі та зручні для людини повідомлення.
e1v
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.