Перетини readonly | optional
Коротко:
- При перетині властивостей з однаковим ім'ям тип властивості береться як перетин типів (
T1 & T2). readonly"перемагає": якщо хоча б в одному типі властивістьreadonly, у перетині вона будеreadonly.- Обов'язковість "перемагає": якщо в одному типі властивість обов'язкова, у перетині вона стане обов'язковою; опціональною залишається тільки якщо опціональна в усіх частинах.
Нижче - наочно.
1) readonly × звичайне поле
javascript
type A = { readonly x: number };
type B = { x: number };
type C = A & B; // { readonly x: number }- Має задовольняти обом типам одразу -> змінювати
xне можна =>readonly. - Якщо типи несумісні, вийде нереалізованість:
javascript
type D = { readonly x: number } & { x: string };
// x: number & string -> never -> тип цілком стає непредставимим (по суті, never)Правило: для однакового ключа модифікатор
readonlyу перетині завжди зберігається, якщо зустрічається хоча б в одному доданку.
2) Як перетин впливає на optional (?)
a) Опціональне × обов'язкове -> обов'язкове
javascript
type A = { x?: number };
type B = { x: number };
type C = A & B; // { x: number }- Щоб задовольнити
B,xмає існувати; отже, підсумкова властивість обов'язкова.
b) Опціональне × опціональне (із сумісними типами)
javascript
type A = { x?: number };
type B = { x?: number };
type C = A & B; // { x?: number }- Опціональність зберігається, оскільки в обох частинах властивість опціональна і типи сумісні.
c) Опціональне × опціональне (із несумісними типами)
javascript
type A = { x?: string };
type B = { x?: number };
type C = A & B; // { x?: never }- Тип властивості:
string & number->never. - Семантика
x?: never: властивість не можна вказувати (якщо вкажеш - не зможеш дати коректне значення), але її можна опустити. - Фактично це поводиться так, ніби "властивості
xнемає".
d) Опціональне × обов'язкове (із несумісними типами)
javascript
type A = { x?: string };
type B = { x: number };
type C = A & B; // { x: never } // обов'язкове, але ніколи не реалізовне- Виходить суперечність: властивість обов'язкова, але її тип -
never=> перетин нерозв'язний (по суті,never).
e) Змішування з readonly
javascript
type A = { readonly x?: number };
type B = { x: number };
type C = A & B; // { readonly x: number }- Обов'язковість "перемагає",
readonlyзберігається.
Пам'ятка (інтуїтивні правила)
- Тип:
T = T1 & T2. - Обов'язковість: якщо хоча б в одному типі властивість обов'язкова -> у перетині вона обов'язкова; опціональна лише якщо опціональна всюди.
- readonly: якщо хоча б десь
readonly-> у перетиніreadonly. - Якщо підсумковий тип властивості став
never, а властивість обов'язкова -> весь тип не реалізовний (по суті,never). Якщо підсумковий типnever, а властивість опціональна -> властивість "заборонена до вказання", але може бути опущена.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.