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

Увы, но дело не в -вариантности. Дело в том, как TS

обходится с методами типов-пересечений, в том числе и для дженериков. TS глубоко наплевать на то, что мы берём Array<T> и Array<G> и складываем их; частный случай сложения двух, эээ, разных инстансов одного класса типов не рассматривается; анализируется сложение двух каких-то типов, не будем обращать внимание на их структуру пока что.

Аксессор простого свойства будет работать, как и ожидалось — и для T[] & G[] и для (T & G)[] TS выведет, что нас интересует тип T & G, что мыслится мне вполне корректным.

С методами несколько интереснее. Уберём дженерики из рассмотрения, посмотрим на простой синтетический пример тут . Тип функции вывелся ещё кое-как, но какой тип её первого аргумента? Казалось бы, это такая хитрая функция, которая берёт первым аргумент одновременно и string, и number, то есть string & number, то есть, вообще говоря, never... У меня есть стойкое мнение, что при проектировании TS возникло здесь больше вопросов, чем ответов, у авторов, и они пошли по пути наименьшего сопротивления. Путь наименьшего сопротивления — при необходимости зарезолвить свойство, тип которого является пересечением типов-функций, выбирать одну из перегрузок (последнюю, если я не ошибаюсь).

Поэтому T[] & G[] в качестве сигнатур функций выбирает сигнатуры G[]. Это очень нехорошо. Скорее всего вам нужно не это. Не делайте так.

8 ответов

8 просмотров

Вот это крутое объяснение! 👍 Вот только насчёт "не делайте так" - тут проблема - ведь ТС сам такие типы инферит - что делать?

Andrey-Kurnoskin Автор вопроса

Если немного подумать, то тип (inp: string) => string & (inp: number) => string можно было бы интерпретировать как (inp: string | number) => string. По-моему, я когда-то находил причину, по которой такого рода преобразования не всегда корректны, и задача в общем случае так себе решаема

Andrey-Kurnoskin Автор вопроса

А есть пример того, когда такой тип инферится?

Вот тут ошибка, кстати, ни о каком OR (|) речь не шла

Andrey-Kurnoskin Автор вопроса

type fromStringToString = (inp: string) => string; // Область определения — строки type fromNumberToString = (inp: number) => string; // Область определения — числа type enigma = fromStringToString & fromNumberToString; // enigma == ((inp: string) => string) & ((inp: number) => string) Казалось бы, последняя запись значит, что функция типа enigma обладает всеми признаками как типа fromStringToString, так и типа fromNumberToString. Следовательно, в неё можно передать строку, и получить строку, и также можно передать число, и получить строку. Это вполне соответствует именно записи (inp: string | number) => string — благо, пример несложный. А вот пример сложнее: type f1 = (inp: 'a' | 'b') => 'x'; type f2 = (inp: 'b' | 'c') => 'z'; type f3 = f1 & f2; // Что это за покемон?

Есть пример

да тут изи, тут int & string === never

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

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

Сообщение* в закодированном виде. То есть, просто сделать sendMessage?text=Привет бла-бла! не получится, надо в HEX переводить, и добавлять процент, типа такого: sendMessage?t...
КТ315
21
А случайно нет ли в паскале штатной возможности передать указатель и количество туда где array of в качестве аргумента?
zamtmn
25
Anyone here suffers from unexplained aural migraines, who would be up for talking for a bit? Doesn't *have* to be aural, but I am not asking about headaches, I mean actual mi...
Martin Rys
58
Только такой if ($modx->event->name == 'OnBeforeCartItemAdding') { $meta = $params['item']['meta']; $lang = $modx->getConfig('_lang'); // проверяем, задана ли опция i...
Multi Web
1
Всем привет. Испытываю проблемы в работе БД, а именно огромного роста логов, такого характера: 024-05-16 18:39:07 +05 sentry sentry [unknown] 1050169 7-1 app-sentry01.corp.ru>...
Alexey
2
Ну раз я пока тут, задам пару глупых вопросов. Зачем писать на ассемблере если компилятор довольно умный, а ассемблер много времени занимает? В каких прикладных задачах сейчас...
Максим Рябцев
20
Хм. А телеграм апи работают через HTTP?
The Bird of Hermes
14
Если подытожить: По мнению Розыча и Хемуля и др. - предпочтительно по возможности объявлять в секции имплементации потому-что: 1) Выше скорость компиляции 2) Не замусоривается...
notme
7
Почему Telegram пишет, что объект media не найден, хотя на самом деле я его передаю? Делаю на urllib, без зависимостей, так надо. Вызываю метод sendMediaGroup с таким JSON: ...
Alexey S
1
В дельфе нет никакого коробочного (без установки третьих либ) способа получить CallStack с расшифровкой отладочных символов?
notme
7
Карта сайта