Использование never в TypeScript
опустим мы хотим написать компонент диалог. Его размер может задаваться двумя различными способами:
1. Явно с помощью width и height
2. Диалог должен принять размер контента, за это отвечает свойство responsive
Тут есть несколько проблем:
1. Чтобы передать либо width и height или только responsive, мы пометили все поля как необязательные и теперь мы можем передать неправильный набор полей или не передать ни одного вовсе.
2. Можем передать все параметры одновременно и в таком случае непонятно, должен диалог быть отзывчивым или отобразиться с указанным размером.
Нам нужно реализовать тип, в котором все поля будут обязательными, но который позволит нам передать либо width и height либо responsiv , в противном случае мы должны получить ошибку компиляции.
Такой интерфейс будет выглядеть вот так:
type DialogProps = { title: string } & ( | { responsive: boolean; width?: never; height?: never; } | { responsive?: never; width: number; height: number; } );
never - пустое множество или проще говоря, это тип, которому не может быть присвоено ни одно значение.
// ✅ correct const withSize: DialogProps = { title: "Dialog with Size", width: 600, height: 500, responsive: undefined }; // ❌ incorrect const incorrect: DialogProps = { title: "Incorrect Props Dialog", responsive: false, width: 600 height: 500 };
В третьем примере мы получим ошибку ?.
