#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. Звучит интересно. Так что да, если данные еще не загружены, компонент получает фиктивные элементы и пропускает их обработку.