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

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

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

type FileReader = File & ErrorHandling;

И

type FileReader = File | ErrorHandling;

7 ответов

15 просмотров

Да, тут у ТСа в каком-то смысле контринтуитивное поведение. Как это надо читать: 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 & это просто слияние свойств, то почему ...

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта