TypeScript, статически типизированная расширенная версия JavaScript, предлагает мощные инструменты для работы со сложными структурами данных. Одной из распространенных проблем является сужение объектов до определенных типов или подмножеств на основе определенных условий. В этой статье мы рассмотрим различные методы сужения объектов в TypeScript, а также приведем примеры кода. Эти методы помогут вам написать более надежный и безошибочный код.
- Защита типов.
Защита типов — это фундаментальный механизм TypeScript для сужения типов объектов на основе проверок во время выполнения. Вы можете использовать предикатыtypeof,instanceofили собственные типы для создания защиты типа. Вот пример:
interface Circle {
kind: 'circle';
radius: number;
}
interface Square {
kind: 'square';
sideLength: number;
}
function calculateArea(shape: Circle | Square): number {
if (shape.kind === 'circle') {
return Math.PI * shape.radius 2;
} else if (shape.kind === 'square') {
return shape.sideLength 2;
}
throw new Error('Invalid shape');
}
- Дискриминированные объединения.
Дискриминированные объединения, также известные как теговые объединения или алгебраические типы данных, позволяют сузить типы объектов на основе дискриминантного свойства. Свойство дискриминанта — это литеральный тип, общий для всех объектов в объединении. Вот пример:
interface SuccessResponse {
success: true;
data: any;
}
interface ErrorResponse {
success: false;
error: string;
}
type APIResponse = SuccessResponse | ErrorResponse;
function handleResponse(response: APIResponse) {
if (response.success) {
console.log('Data:', response.data);
} else {
console.error('Error:', response.error);
}
}
- Условные типы.
Условные типы позволяют выполнять сужение типов на основе условных операторов. Вы можете использовать ключевое словоextends, чтобы определить ограничения типов и вывести результирующие типы. Вот пример:
type NonNullable<T> = T extends null | undefined ? never : T;
function processValue<T>(value: T): NonNullable<T> {
if (value === null || value === undefined) {
throw new Error('Value cannot be null or undefined');
}
return value;
}
- Пользовательские средства защиты типов.
Вы можете создать свои собственные средства защиты типов, определив пользовательские функции, которые возвращают логическое значение. Эти функции выполняют проверки во время выполнения и соответствующим образом сужают типы объектов. Вот пример:
function isString(value: any): value is string {
return typeof value === 'string';
}
function processInput(input: string | number) {
if (isString(input)) {
console.log(input.toUpperCase());
} else {
console.log(input * 2);
}
}
Освоение искусства сужения объектов в TypeScript имеет решающее значение для написания типобезопасного и удобного в сопровождении кода. В этой статье мы рассмотрели несколько методов, включая защиту типов, распознаваемые объединения, условные типы и защиту определяемых пользователем типов. Используя эти методы, вы можете сделать свой код более надежным и менее подверженным ошибкам во время выполнения.
Не забывайте использовать возможности статической проверки типов TypeScript, чтобы выявить любые потенциальные проблемы на ранних этапах процесса разработки. Приятного кодирования!