Использование 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
};
В третьем примере мы получим ошибку ?.