#reactjs #typescript #semantic-ui
Вопрос:
Порывшись в Интернете, я пришел к выводу, что должен просто спросить.
У меня есть форма семантического пользовательского интерфейса в React with TypeScript (строгая).
Я пытаюсь предоставить параметры из своего api rest в раскрывающемся списке (выбрать) в форме (обрезанный ненужный код):
Форма[.tsx]:
<Form.Select options={()=>{getOptions()}} />
И моя функция GetOptions:
//I put the DropdownItemProps[] type because I thought it would solve my issue
const getOptions = ():DropdownItemProps[] => {
let options = new Array<DropdownItemProps>();
//... restful request
return (options)
}
Машинопись кричит на меня:
Type '() => void' is missing the following properties from type 'DropdownItemProps[]': pop, push, concat, join, and 27 more.ts(2740).
FormSelect.d.ts(24, 3): The expected type comes from property 'options' which is declared here on type 'IntrinsicAttributes amp; FormSelectProps amp; { children?: ReactNode; }'
Я не уверен, почему ts определяет мою функцию как '()=>void'
(когда я навожу курсор на функцию, она четко определяет ее как () => DropdownItemProps[]
). Честно говоря, я даже не уверен DropdownItemProps[]
, что это правильный тип, который мне нужно вернуть из моей getOptions()
функции.
Редактировать: просто для ясности, если я изменю вызов на options={()=>getOptions()}
options={getOptions}
или что-то подобное , я получу тот же результат, но вместо '()=>void'
этого он признает возвращаемое значение '()=>DropdownItemProps[]'
.
Я в основном искал везде, о чем мог подумать, но в документах Semantic-UI нет ничего о машинописи (что немного раздражает).
Любая помощь будет признательна.
Комментарии:
1. Кроме того , я не был уверен, должен ли я использовать функцию стрелок
getOptions
, но когда я этого не сделал и просто сделалoptions={getOptions}
, ts предложил «Вы хотели вызвать это выражение?». И даже если я проигнорирую его, он все равно говорит:Type '() => DropdownItemProps[]' is missing the following properties from type 'DropdownItemProps[]': pop, push, concat, join, and 27 more.
2. вам нужно удалить скобки и просто написать ()=>GetOptions() или, если вы хотите, чтобы скобки просто добавляли return перед GetOptions() ()=>>{ return GetOptions()}
3. @Jerome это дает мне то же самое, что я написал в комментарии.
Ответ №1:
вот рабочий пример, похоже, ваша функция GetOptions не возвращает массив объектов
import React, { FC } from "react";
import { Form } from "semantic-ui-react";
const getOptions = ():DropdownItemProps[]=> {return [{'keyA': 'label A'}, {'keyB': 'label B'}]}
const Test=()=>{
return (
<Form>
<Form.Select options={getOptions()} />
</Form>
)
}
export {Test}
Комментарии:
1.
options={getOptions()}
вызовет ли функция немедленно при рендеринге «нет»? Разве не в этом весь смысл введения функции стрелки?2. но если вы не вызовете функцию, какие параметры будут отображаться ? вот почему реквизит параметров ожидает массив объектов… взгляните на определение выпадающего списка. Это объясняется само собой :
export interface DropdownItemProps extends StrictDropdownItemProps { [key: string]: any }
3. Вы правы, я не продумал это до конца.