Size: a a a

2021 February 15

IL

Ihor Levchenko in Frontend UA
Roman 🔘
Ничего, с последними апдейтами сторибука, сильно больше времни уходило на его поддержку в актуальном состоянии, чем он нам экономил времени
а..
у меня сторибук это основное отображение всех компонентов и всего и вся, первичный девелопмент контейнеров и мелких компонентов именно там ведется

а потом уже они в боевой проект добавляются
источник

OA

Oleh Aloshkin in Frontend UA
Условно у меня есть два типа:

export interface A {
 component: 'div'
 a: string
}

export interface B {
 component: 'span'
 b: string
}

И вот они юзаются в зависимости от ситуации какой компонент я рендерю

export type GenericProps = A | B

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   return <component>{props.a}</component>
 }

 return (...)
}

И вот когда я запрашиваю  
{props.a}
оно ругается мол что может быть не найдено a, потому что оно не существует для интерфейса B, хотя я беру его внутри if

Решаю я это так:

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   const a = 'a' in props ? a : undefined
   return <component>{props.a}</component>
 }

 return (...)
}

Можно ли как-то по другому, что бы не писать такое полотнище?
источник

OA

Oleh Aloshkin in Frontend UA
источник

DB

Dima Bildin in Frontend UA
Oleh Aloshkin
Условно у меня есть два типа:

export interface A {
 component: 'div'
 a: string
}

export interface B {
 component: 'span'
 b: string
}

И вот они юзаются в зависимости от ситуации какой компонент я рендерю

export type GenericProps = A | B

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   return <component>{props.a}</component>
 }

 return (...)
}

И вот когда я запрашиваю  
{props.a}
оно ругается мол что может быть не найдено a, потому что оно не существует для интерфейса B, хотя я беру его внутри if

Решаю я это так:

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   const a = 'a' in props ? a : undefined
   return <component>{props.a}</component>
 }

 return (...)
}

Можно ли как-то по другому, что бы не писать такое полотнище?
А если проверять props.component? Должно работать
источник

OA

Oleh Aloshkin in Frontend UA
Я опечатался, да. Там скорее будет еще что-то типо const { component } = props в начале
источник

OA

Oleh Aloshkin in Frontend UA
Потому что component существует всегда
источник

DB

Dima Bildin in Frontend UA
Ну вот если не делать destructure
источник

OA

Oleh Aloshkin in Frontend UA
Хм, хорошо. Typescript такого не понимает с destructure?
источник

DB

Dima Bildin in Frontend UA
По-видимому
источник

OA

Oleh Aloshkin in Frontend UA
Да, спасибо работает
источник

EO

Eugene Obrezkov in Frontend UA
Oleh Aloshkin
Условно у меня есть два типа:

export interface A {
 component: 'div'
 a: string
}

export interface B {
 component: 'span'
 b: string
}

И вот они юзаются в зависимости от ситуации какой компонент я рендерю

export type GenericProps = A | B

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   return <component>{props.a}</component>
 }

 return (...)
}

И вот когда я запрашиваю  
{props.a}
оно ругается мол что может быть не найдено a, потому что оно не существует для интерфейса B, хотя я беру его внутри if

Решаю я это так:

export const GenericField: React.FC<GenericFieldProps> = props => {
 if (component === 'div') {
   const a = 'a' in props ? a : undefined
   return <component>{props.a}</component>
 }

 return (...)
}

Можно ли как-то по другому, что бы не писать такое полотнище?
Там вроде надо ещё один тип делать, не помню
источник

OA

Oleh Aloshkin in Frontend UA
Я не знал про это
источник

OA

Oleh Aloshkin in Frontend UA
источник

EO

Eugene Obrezkov in Frontend UA
Eugene Obrezkov
Там вроде надо ещё один тип делать, не помню
Выносить общее в отдельный интерфейс, а от него уже наследовать частные случаи
источник

OA

Oleh Aloshkin in Frontend UA
Eugene Obrezkov
Там вроде надо ещё один тип делать, не помню
Да меня вроде так тоже устроит
источник

OA

Oleh Aloshkin in Frontend UA
Eugene Obrezkov
Выносить общее в отдельный интерфейс, а от него уже наследовать частные случаи
Я так и сделал вроде бы
источник

EO

Eugene Obrezkov in Frontend UA
Где-то в закромах документации тайпскрипта видел как по хорошему tagged unions делать
источник

EO

Eugene Obrezkov in Frontend UA
И там так советовали
источник

OA

Oleh Aloshkin in Frontend UA
Я могу показать реальный код
источник

OA

Oleh Aloshkin in Frontend UA
источник