169 похожих чатов

Ребята, вы делали narrowing в Реакт ? IPropsA = {a: string} IPropsB

= {b: string}

const SomeComponent:React.FC<IPropsA | IPropsB> = ({a, b}) => {
render .....
}
Тайпскрипт ругает что в пропсах нет а и b

Подскажете как правильно ??

неужели я должен буду делать так
if('a' in props) {
.....
}

if('b' in props) {
.....
}

9 ответов

19 просмотров

кажется, что так надо типизацию переписать как будто типа a?: string b?: string поприятнее будет, можно просто проверить if (b) или if (a) либо написать оболочку для компонента с нужными типами) ну это первое что в голову пришло

Кузьма-Макаров Автор вопроса
Natalie
кажется, что так надо типизацию переписать как буд...

я наоборот хотел сделать построже, ? не особо люблю, стараюсь меньше юзать

Чуть подправлю запись для обьяснения: type IProps = IPropsA | IPropsB здесь `Props` так называемое не дескриминируемое множество. То есть такое, где тайпскрипт не может отличить `IPropsA` от `IPropsB` Вам нужно либо везде писать IF либо сделать множество дескриминируемым. Делается это добавлением некого поля-дескриминатора: type IPropsA { type: "PropsA" a: string }; type IPropsB { type: "PropsB" b: string }; type Props = IPropsA | IPropsB // теперь нужно только подсказать тс какой обьект где: const SomeComponent:React.FC<IPropsA | IPropsB> = (props) => { if(props.type === "PropsA") { console.log(props.a) // a больше не undefined, т.к ТС уже знает что это IPropsA } }

Кузьма-Макаров Автор вопроса
Bohdan
Чуть подправлю запись для обьяснения: type IProp...

да ты прав по идее так и должно быть видимо мне тогда придется в рендерах писать типа вот так {props.type==='PropsA' && <some div>} но вот почему то обычная такая проверка не совсем работает работает вот такая проверка лучше {'a' in props && <some div>}

type A = { a: string; }; type B = { b: string; }; type C = A & B; const x: C = { a: 'sadas', b: 'asdsad', };

Кузьма Макаров
да ты прав по идее так и должно быть видимо мне т...

Не обязательно так. Зависит от юзкейса. Если ты создаешь единый интерфейс к множеству компонентов, то можно делать как то так, на примере кнопок: // outline-button type OutlineButtonProps = { variant: "outline"; a: string } const OutlineButton:FC<OutlineButtonProps> = ... // solid-button type SolidButtonProps = { variant: "solid" b: string } const SolidButton: FC<SolidButtonProps> = .... // button type ButtonProps = SolidButtonProps | OutlineButtonProps const components: Record<ButtonProps["variant"], ReactElement<ButtonProps>> = { "solid": SolidButton, "outline": OutlineButton, } const Button: FC<ButtonProps> = (props) { const Component = components[props.variant] ?? throw new Error("..."); return <Component {...props} /> } P.S писал по памяти, так что не уверен что правильно выбрал\проаннотировал интерфейсы, но общая идея должна быть понятна.

Bohdan
Чуть подправлю запись для обьяснения: type IProp...

type TProps , раз уж про венгерскую нотацию речь зашла ) interface IProps...

Den Pol
type TProps , раз уж про венгерскую нотацию речь з...

Да я там в целом зафакапил почти весь текст. Хотел по быстрому продемонтрировать концепт при этом пользуясь словарем спрашивающего, растерялся. :(

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта