Да, тут у ТСа в каком-то смысле контринтуитивное поведение. Как это надо читать: type FileReader = File & ErrorHandling означает фактически следующее - тип FileReader должен одновременно удовлетворять и File и ErrorHandling. То есть любое значение этого типа должно также подпадать и под первый интерфейс, и под второй интерфейс. Поэтому собственно он и должен содержать свойства из обоих типов. type FileReader = File | ErrorHandling означает следующее - тип FileReader не должен одновременно удовлетворять оба интерфейса. Достаточно чтобы он удовлетворял только одному из них. Именно поэтому он должен быть либо File, либо ErrorHandling
И получается для того самого пересечения из теории множеств надо писать что-то типа такого: Record<keyof (File | ErrorHandling), A[keyof (File | ErrorHandling)]>
Если мы говорим об интерфейсах - интерфейсы это множество свойств. в ts & - это просто слияние свойств. Ты записываешь обоих множеств в новое. Если мы говорим о |, то это не или. Там есть слияние общих свойств, но далее ts помнит что на самом деле есть скрытые свойства - это нужно для уточнения типов. Ты можешь попробовать запросит свойство и если оно будет в одном из скрытых множеств - оно выкинет из него те, в которых данного свойства нет. Если ты создашь контекст ограничивающий множество до одного - твой тип уточнится до конечного интерфейса.
Если в TS & это просто слияние свойств, то почему (A|B|C)&C = C?
Так вот вопрос том, как TS определяет что делает оператор & в каждом конкретном случае? Вот ещё пример: type Foo = { bar: string } type Test = (number | string) & Foo;
Оператор TS в контексте типов всегда делает одно и тоже - он возвращает тип, который удовлетворяет ограничениям обоих его операндов. Если контекст 2 интерфейса - значит это будет интерфейс со свойствами обоих интерфейсов. Если это строка и интерфейс - значит это будет интерфейс со свойствами обоих интерфейсов, потому что в JS всё есмъ объект. Если это union и интерфейс - значит это будет интерфейс со свойствами интерфейса и одного из интерфейсов из union'а
Кажется я ввёл в заблуждение тут, имел в виду для стринг литералы, лень было кавычки писать.
Обсуждают сегодня