Правильное использование React.События в TypeScript 2.0?

#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 является реализацией той же основной идеи.