#javascript #node.js #reactjs #typescript
#javascript #node.js #reactjs #typescript
Вопрос:
У меня есть приложение, использующее React и TypeScript. Недавно я обновил свои определения типов, чтобы использовать @types
пространство имен npm для их хранения в моей node_modules
папке.
Ранее при работе с событиями DOM сигнатура метода, подобная этой, удовлетворяла определениям типов:
public updateValue(e: React.FormEvent): void {
Однако теперь я получаю ошибки компилятора:
(46,25): error TS2314: Generic type 'FormEvent<T>' requires 1 type argument(s).
И после просмотра в папке определений типов react он действительно принимает общий:
interface FormEvent<T> extends SyntheticEvent<T> {
}
Мой вопрос в основном заключается в том, каков вариант использования этого универсального, как его следует использовать и какие преимущества он добавляет? Я мог бы просто изменить свой метод на:
public updateValue(e: React.FormEvent<any>): void {
И это удовлетворит требованию определения типа. Но каков предполагаемый вариант использования?
Комментарии:
1. Вы сказали, что получаете это определение от @types ? Это удивительно, учитывая, что DefinitelyTyped react.d.ts не имеет такого определения как общего.
2. @types извлекается из
types 2.0
— github.com/DefinitelyTyped/DefinitelyTyped/blob/types-2.0/react / … Не уверен, смогу ли я направить его на другое репо?
Ответ №1:
При чтении файла react.d.ts, который вы связали, похоже, что этот общий параметр соответствует HTMLElement, указанному в свойстве currentTarget . В документах Mozilla указано, что это обычно элемент.
[currentTarget: EventTarget amp; T;]
T остается неопределенным до
interface ReactHTMLElement<T extends HTMLElement> extends DOMElement<HTMLAttributes<T>, T> {
что, по-видимому, подтверждает идею о том, что T является элементом. Я считаю, что целью универсального является возможность доступа к свойствам, зависящим от элемента (например, теги src и HTMLImageElement
тому подобное), в свойстве currentTarget . Существует проблема, которая предполагает выполнение чего-то подобного в основных библиотеках вместе с некоторыми обсуждениями связанных с этим проблем.
Из того, что я могу сказать, типизация react является реализацией той же основной идеи.