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

Добрый вечер, коллеги. Всех с Новым годом. Подскажите, пожалуйста, почему я

получаю ошибку с типами в свитче в следующем коде?

Причем если поля и их типы указать ручками, а не сослаться на них в объекты, то ошибка пропадает

const FIELDS = {
TYPE: 'type',
} as const;

const TYPES = {
FIRST: 'first',
SECOND: 'second',
} as const;

type IFirstType = {
[FIELDS.TYPE]: typeof TYPES.FIRST;
};

type ISecondType = {
[FIELDS.TYPE]: typeof TYPES.SECOND;
}

type IMainType = IFirstType | ISecondType;

function handleFirstType(data: IFirstType) {}

function handleSecondType(data: ISecondType) {}

function handleMessage(data: IMainType) {
switch (data[FIELDS.TYPE]) {
case TYPES.FIRST: {
handleFirstType(data);
break;
}
case TYPES.SECOND: {
handleSecondType(data);
break;
}
}
}


Argument of type 'IMainType' is not assignable to parameter of type 'IFirstType'.
Type 'ISecondType' is not assignable to type 'IFirstType'.
Types of property '[FIELDS.TYPE]' are incompatible.
Type '"second"' is not assignable to type '"first"'

6 ответов

6 просмотров

воспользуйся TypeGuard

Не доглядел) А в ts issues не смотрел?

Ivan- Автор вопроса
Evgen K
Не доглядел) А в ts issues не смотрел?

Если честно, то нет. Даже не знаю как этот кейс там отыскать + я начал грешить на себя, так как он мне показался достаточно простым, думал может торможу где-то я

Ivan- Автор вопроса
Sergei Vakhrushev
воспользуйся TypeGuard

Ты имел ввиду что-то вроде этого? const FIELDS = { TYPE: 'type', } as const; const TYPES = { FIRST: 'first', SECOND: 'second', } as const; type IFirstType = { [FIELDS.TYPE]: typeof TYPES.FIRST; }; type ISecondType = { [FIELDS.TYPE]: typeof TYPES.SECOND; } type IMainType = IFirstType | ISecondType; function handleFirstType(data: IFirstType) {} function handleSecondType(data: ISecondType) {} function getIsFirstType(data: IMainType): data is IFirstType { return data.type === TYPES.FIRST; } function handleMessage(data: IMainType) { if (getIsFirstType(data)) { handleFirstType(data); return; } handleSecondType(data); }

Ivan- Автор вопроса
Ivan
Ты имел ввиду что-то вроде этого? const FIELDS = ...

Заработало, спасибо! НО все равно непонятно, почему в моем кейсе он не сработал, ведт union был достаточно простой, чтобы его сузить “налету”. Видимо у typescript с этим проблема

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

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

А чем вам питонисты не угодили?😂
.
79
Всем привет, написал код ниже, но он выдает сегфолт, в чем причина? #include <stdio.h> #include <stdlib.h> #include <string.h> struct product { char *name; float price; };...
buzz базз
75
Ещё такой вопрос. Мне необходимо хранить пароль пользователя локально. Для этого планирую использовать ini файл. Это для автозаполнения полей логин и пароль при авторизации. Е...
Евгений
19
Ты просто гитлеровскую эстетику плохо понимаешь. Он же всё под Цезаря делал. А это как бы запрещённый приём в политике. Пиджаки они зачем все носят? Чтобы показать что они тип...
Ivan Kropotkin
4
а чем лучше всего сделать глобальный лок, если много нодов, до сотни? ну то есть мне надо, чтобы некоторые операции с объектом не происходили одновременно. перемещение между н...
Д. П.
15
А как лучше конвертировать физический адрес в виртуальный при маппинге? В случае ядра у меня, например, direct mapping, первые 768МБ я как есть мапплю в higher half, а остальн...
Evg Resh
26
Hi guys, I'm looking for a good LLM course. Is there any course to learn LLMs in advanced? I'm aiming to use them in my apps, so a perfect course in my openion, is not only a ...
Taha
14
База данных не поможет. Шифрование не поможет. Какие там ещё варианты? Накидывайте.
КТ315
20
А табстоп это сообщение от окна или от элемента управления?
The Bird of Hermes
18
$params = [ 'formid' => 'feedbackForm', 'formTpl' => '@CODE: <form class="form-validate" data-id="ajax_form"> <fieldset class="margin-bottom-md"> ...
Pathologic
1
Карта сайта