typescript правила работа утилиты
type n<T> = T & {}
ни как не могу понять почему так работает
то есть пересечение пустого объекта и типа содержащего null undefined удаляет их и возвращает типы без них
Ответы (1 шт):
В 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 // ошибка
