typescript правила работа утилиты

type n<T> = T & {}

ни как не могу понять почему так работает
то есть пересечение пустого объекта и типа содержащего null undefined удаляет их и возвращает типы без них


Ответы (1 шт):

Автор решения: Daniil Loban

В Typescript символ | расширяет тип, а & сужает.

Если сравнивать с SQL, то & действует подобно JOIN , а | как UNION

Так же можно сравнить с одноименными битовыми операциями & и |, где & имеет более жесткие правила чем |

Все вышесказанное это лишь аналогии которые возможно помогут запомнить правила для Typescript.

Для лучшего понимания вышесказанного приведу иллюстрацию и код:

type T1 =  number | string  // расширяем
type T2 =  string | boolean // расширяем
type T3 =  T1 & T2 // сужаем

let t3: T3 = "string"

введите сюда описание изображения

Если мы посмотрим что из себя представляет тип объявленный как {} он будет nonullable, т.е. в нем есть все типы кроме null и undefined именно по этой причине типы связаные с ним через пересечения будут лишены тех же свойств.

По этой причине переменные k6 и k7 инициализируются с ошибкой.

type Nonullable<T> = T & {} // {} все типы кроме `null` и `undefined`

let k0: Nonullable<number> = 123
let k1: Nonullable<string> = "null"
let k2: Nonullable<boolean> = true
let k3: Nonullable<symbol> = Symbol("dsa")
let k4: Nonullable<object> = {} 
let k5: Nonullable<bigint> = 100n // ES2020
let k6: Nonullable<undefined> = undefined; // ошибка
let k7: Nonullable<null> = null // ошибка
→ Ссылка