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

Пытаюсь понять intersection. Не могу понять, почему пересечение в данном

случае даёт по сути объединение?
В чём разница

type FileReader = File & ErrorHandling;

И

type FileReader = File | ErrorHandling;

7 ответов

4 просмотра

Да, тут у ТСа в каком-то смысле контринтуитивное поведение. Как это надо читать: type FileReader = File & ErrorHandling означает фактически следующее - тип FileReader должен одновременно удовлетворять и File и ErrorHandling. То есть любое значение этого типа должно также подпадать и под первый интерфейс, и под второй интерфейс. Поэтому собственно он и должен содержать свойства из обоих типов. type FileReader = File | ErrorHandling означает следующее - тип FileReader не должен одновременно удовлетворять оба интерфейса. Достаточно чтобы он удовлетворял только одному из них. Именно поэтому он должен быть либо File, либо ErrorHandling

Hsiwe
Да, тут у ТСа в каком-то смысле контринтуитивное п...

И получается для того самого пересечения из теории множеств надо писать что-то типа такого: Record<keyof (File | ErrorHandling), A[keyof (File | ErrorHandling)]>

Если мы говорим об интерфейсах - интерфейсы это множество свойств. в ts & - это просто слияние свойств. Ты записываешь обоих множеств в новое. Если мы говорим о |, то это не или. Там есть слияние общих свойств, но далее ts помнит что на самом деле есть скрытые свойства - это нужно для уточнения типов. Ты можешь попробовать запросит свойство и если оно будет в одном из скрытых множеств - оно выкинет из него те, в которых данного свойства нет. Если ты создашь контекст ограничивающий множество до одного - твой тип уточнится до конечного интерфейса.

Dilame-Bowzee Автор вопроса

Если в TS & это просто слияние свойств, то почему (A|B|C)&C = C?

Dilame-Bowzee Автор вопроса

Так вот вопрос том, как TS определяет что делает оператор & в каждом конкретном случае? Вот ещё пример: type Foo = { bar: string } type Test = (number | string) & Foo;

Dilame Bowzee
Так вот вопрос том, как TS определяет что делает о...

Оператор TS в контексте типов всегда делает одно и тоже - он возвращает тип, который удовлетворяет ограничениям обоих его операндов. Если контекст 2 интерфейса - значит это будет интерфейс со свойствами обоих интерфейсов. Если это строка и интерфейс - значит это будет интерфейс со свойствами обоих интерфейсов, потому что в JS всё есмъ объект. Если это union и интерфейс - значит это будет интерфейс со свойствами интерфейса и одного из интерфейсов из union'а

Dilame Bowzee
Если в TS & это просто слияние свойств, то почему ...

Кажется я ввёл в заблуждение тут, имел в виду для стринг литералы, лень было кавычки писать.

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

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

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Всем привет! Массив вводится с клавиатуры, кол-во элементов неизвестно, поэтому я указал arr db 100 dup(?) С нахождением максимума проблем нет, а вот минимум почему-то всегд...
En Vind Av Sorg
11
кто шарит: mattermost отслеживает что ты на пк запускаешь?
Valentin
13
Помогите, пожалуйста, делаю программу для для подсчёта корней квадратного уравнения, знаю, что есть куча недочётов, недоработок, но основная проблема в том, что почему-то при ...
NYC
13
#include <stdio.h> int main(void) { int n; scanf("%d", &n); int digits1[n] = {0}; int digits2[n] = {0}; я не могу таким образом заранее массив нулями заполнить?
Linus
12
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
я про форму записи. смысл указывать что 8 байтный регистр 8 байт?
Aiwan \ (•◡•) / _bot
10
Вроде бы вопрос уже заезжанный, но тем не менее У меня есть функция menu() которая выводит набор возможных действий, а затем спрашивает у пользователя что он хотел бы сделать....
David Golovatin
5
Карта сайта