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 ответов

9 просмотров

кажется, что так надо типизацию переписать как будто типа 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 , раз уж про венгерскую нотацию речь з...

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

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

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

Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Коллеги, доброе утро. Запустил на удаленном хосте приложение (ручками зашел туда по ssh и запустил, не командой удаленно). Создал потом ssh-туннель, и с моей машины приложение...
Δημήτηρ
9
Всем привет, подскажите/посоветуйте пожалуйста. Фаердак компоненты, имею одно место где бизнес хочет видеть при открытии формы список всех клиентов, это порядка 30к. Мои дово...
Sasha Sch
14
Ребят, если кто в курсе - скажите, а в загранке такое же засилье маркетплейсов? или там простые сермяжные интернет-магазины живут попроще?
Андрей [aharito] Харитонов
11
Хотел бы спросить у знающих, правильную ли я выбрал книгу для начала изучения ассемблера Юрова В.И ? Или есть более лучшие книги для начала обучения?
Botsman
31
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
10
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Книга Юрова В.И пойдёт для обучения?
Botsman
24
I was reading a lot about API and REST API and I still don't get it, what's a application programming interface? 😄 How to build a private API for getting other informations f...
Witold 🖤🩶
12
Всем доброго дня, ребят подскажите пожалуйста, если в курсе по ассемблеру используется MASM32, могу ли я использовать FASM? В чем явная разница и будет ли у меня все работать?
Botsman
17
Карта сайта