MyComp: FunctionComponent<MyProps<…>> = ({ prop }) => {
return <div>hello</div>;
};
Как то должно быть примерно так:
export const MyComp<T>: FunctionComponent<MyProps<T>> = ({ prop }) => {
return <div>hello</div>;
};
Но такой синтаксис неверный. Как правильно написать?
Это необходимо чтобы во время использования компонента я мог задать тип с которым работает компонент:
<MyComp<MyType> />
если вы пришли к таким костылям то вероятно делаете что-то не так
Не понял. Если я написал дженерик компонент то я делаю что-то не то? Дженерик компонентов не должно существовать?)
const Comp = <T,>(props: Props<T>) => ...
А для чего тогда придумали дженерик компоненты?) Почему во всех популярных библиотеках они есть? Как передавать типы в дженерик типы пропсов?)
Расслабься, он кекает
Спасибо) А можно как-то это сделать с использованием типа FunctionComponent ?
Не надо его использовать, он не очень. Тс отлично выводит типы из моего примера
я не знаю для чего это придумали, это решает проблему тех у кого тайпскрипт головного мозга.
const FN = <T,>(props: T): ReturnType<React.FunctionComponent<T>> => { return <></> } Можно так, но похоже на костыль)
Если посмотреть что возвращает FC, то можно написать так const FN = <T,>(props: T): React.ReactElement<T> => { return <></> }
Спасибо! А почему если после T убрать запятую то перестаёт работать? Что это за синтаксис такой?
потому что он видит это как реакт-компонент иначе
https://codesandbox.io/s/competent-hypatia-zhl94?file=/src/App.tsx
потому что tsx корявенький, считает, что <T> - открывающий “элемент” компонента Т
а можно разрешить тайпскрипту самому справляться, как взрослому const FN = <T,>(props: T) => { return <></> }
Да, но человек хотел возвращать FC
человек хотел generic-компонент
В этом случае тип props неверный. Например он не содержит children.
а у любого компонента есть children?
я думаю тут апеллируют к тому, что FC подразумевает их наличие по умолчанию
ну да, ты прав — я чёт не уследил за твоими “интонациями”
В моём случае есть.
я понимаю. и считаю, что далеко не каждый компонент должен иметь children в тайпингах. поэтому и FC считаю херовым типом. потому что не все компоненты должны принимать детей
good for you
я бы побоялся такое людям показывать, но это вкусовщина конечно
его придумали, чтобы было удобно. чтобы полиморфизм был статически типизирован. если тебе полиморфизм не нужен — понимание придёт со временем
да просто синтетический пример списка, который умеет понимать, какими данными он оперирует. конечно же выглядит как кусок херпоймичего, но на то он и синтетический пример
это тот случай когда тайпскрипт в моей картине мира делает слишком много
тут одно из двух — либо у тебя картина маленькая, либо параметрический полиморфизм придумали дураки для дураков
а где третий вариант что я не писал код который требовал бы подобных костылей?
Спасибо дед. Который раз выручаешь.
он в первых двух — ты считаешь параметрический полиморфизм костылями — значит либо он придуман дураками для дураков, либо ты не понимаешь, зачем нужен параметрический полиморфизм
я считаю дженерики в реакт компонентах костылями*
мне кажется тут не о дженериках речь, а скорее о статическая типизация vs динамическая
дженерики — это параметрический полиморфизм. дженерики в реакт-компонентах — это всё так же параметрический полиморфизм
есть компонент, есть его имплементация, в моей картине мира если для этого требуется дженерик то человек делает что-то неправильно </thread>
go developer detected
значит дураками для дураков, окей)
Ема, сколько новых слов)
Обсуждают сегодня