Ограничения React / Typescript для функций onRenderCell / onClick / …?

#reactjs #fluent-ui

#reactjs #fluent-пользовательский интерфейс

Вопрос:

Я пытаюсь запустить пример Fluent UI Basic List на своем собственном компьютере. Пример представлен здесь:https://developer.microsoft.com/en-us/fluentui#/controls/web/list. Я скопировал весь код примера в приложение и заменил данные примера своим собственным массивом. Однако я получаю следующую ошибку:

 Type '(item: IExampleItem, index: number | undefined) => JSX.Element' is not assignable to type 
'(item?: { key: number; name: string; } | undefined, index?: number | undefined, isScrolling?: 
boolean | undefined) => ReactNode'.`
Types of parameters 'item' and 'item' are incompatible.
Type '{ key: number; name: string; } | undefined' is not assignable to type 'IExampleItem'.
  Type 'undefined' is not assignable to type 'IExampleItem'.  TS2322

83 | 
84 | 
85 |       <List items={data} onRenderCell={onRenderCell} />
   |                          ^
86 | 
87 |   );
88 | };
  

Это потому, что это файл Typescript? Должен ли я что-то отключить, чтобы изменить компиляцию и предотвратить такие ошибки?

Мой код после изменений выглядит следующим образом:https://codepen.io/vipperdev/pen/QWNdeJe

Ответ №1:

Итак, из документации:

onRenderCell

(item?: T, index?: number, isScrolling?: boolean) => React.ReactNode

Метод, вызываемый при попытке отобразить элемент.

Обратите внимание на вопросительный знак рядом с item ? Это означает, что элемент является необязательным, поэтому он может быть или не быть там, верно? Вы также должны обрабатывать это в своей функции с точки зрения типа параметра. Например,

 const onRenderCell = (
  item: IExampleItem | undefined,
  index: number | undefined
): JSX.Element => {
  return (
    <div className={classNames.itemCell} data-is-focusable={true}>
      {item?.name}
    </div>
  );
};
  

Я внес два изменения выше:

  • item: IExampleItem теперь item: IExampleItem | undefined .
  • {item?.name} вместо того, чтобы {item.name} устранить возможность item быть неопределенным.

Вот рабочий codesandbox без ошибки typescript.

Дайте мне знать, если у вас возникнут какие-либо вопросы!

Комментарии:

1. Привет, спасибо. Он начал работать. Означает ли это, что каждый параметр, который является необязательным, должен обрабатываться, поскольку он может быть неопределенным? Почему создатели библиотеки сделали это именно так? Если я укажу точный шаблон для каждого элемента, я думаю, что необязательно охватывать неопределенное состояние, поскольку framework / typescript проверяет его во время выполнения, я прав?

2. @VIPPER если ? присутствует в документации по параметру, то да, их нужно либо рассматривать как X | undefined , либо вы могли бы сделать то же самое, что и они, т. Е. item?: IExampleItem Но это работает только в том случае, если это последний параметр. Здесь это невозможно, потому что у вас также есть параметр после него, т. Е. index .

3. @VIPPER «Почему создатели библиотеки сделали это именно так?» => я предполагаю: они заботятся о сценариях, в которых данные могут загружаться, поэтому элемент пока недоступен.

4. Звучит интересно. Так что да, если данные еще не загружены, компонент получает фиктивные элементы и пропускает их обработку.