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

Всем привет Есть задача сформировать рекурсивный тип данных из другого типа

данных.
Формируется он по такой логике:
type SchemaResultType<S extends Schema> =
S extends ScalarSchema1 ? type1 :
S extends ScalarSchema2 ? type2 :
S extends ComplexSchema3 ? SchemaResultType<someComplexHandler3(S)> :
S extends ScalarSchema4 ? type4 :
S extends ComplexSchema5 ? SchemaResultType<someComplexHandler5(S)> :
...


При использовании в некоторых местах возникает ошибка
Type instantiation is excessively deep and possibly infinite. ts(2589)
(Насколько понимаю, в тех, где Schema заранее неизвестна, а передаётся аргументом).

Возможное решение - проверка типа на any или unknown
Например
type SchemaResultType<S extends Schema> =
S extends any ? any :
S extends ScalarSchema1 ? type1 :
...


Но именно такая проверка не работает и всегда возвращается any (unknown).
Скажите, как исправить?

4 ответов

11 просмотров

Любой тип extends any

Constantine- Автор вопроса
Евгений
Любой тип extends any

И как же сделать нормальную проверку?

> is excessively deep В этом причина. Что если хранить возвращаемый тип в самой схеме, или, чтобы не смешивать сущности, в декларации задать связь схем и возвращаемых типов? type Scalar1 = { schema: ScalarSchema1, returnType: type1 }; type Scalar2 = { schema: ScalarSchema2, returnType: type2 }; type Complex3 = { schema: ComplexSchema3, returnType: SchemaResultType<someComplexHandler3(S)> }; type Scalar4 = { schema: ScalarSchema4, returnType: type4 }; type Complex5 = { schema: ComplexSchema5, returnType: SchemaResultType<someComplexHandler5(S)> }; type SchemaResultType<S extends Schema> = S['returnType'];

Constantine- Автор вопроса
Анатолий Облаухов
> is excessively deep В этом причина. Что если хр...

Проблема уже решена Нужно просто было сделать нормальную проверку на any в SchemaResultType. Так работает правильно: type SchemaResultType<S extends Schema> = 0 extends (1 & S) ? unknown : S extends ScalarSchema1 ? type1 : ... А заранее формировать результирующие типы невозможно из-за того, что в сложных типах могут использоваться любые другие из представленных, в тч другие сложные, но какие именно мы не знаем.

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта