> Что может быть неправильно в решении функции для вычисления площади фигур с использованием типов и интерфейсов TypeScript (TypeScript)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Точка
Стек: TypeScript
> Пример ответа
Короткий ответ
Основные проблемы: неправильное использование type narrowing, отсутствие discriminated unions, нарушение принципа открытости/закрытости (OCP) при добавлении новых фигур, избыточное использование any или unknown без проверок, неверная обработка краевых случаев (нулевые/отрицательные значения). Также часто встречается игнорирование readonly для входных данных и отсутствие защиты от NaN.
Подробное объяснение
Типичная ошибка - использование простого enum или строкового literal для идентификации типа фигуры без discriminated union. Это приводит к необходимости писать дополнительные проверки в runtime и усложняет поддержку. Например, если функция принимает { type: string; ... }, то TypeScript не сможет гарантировать корректность полей для каждого типа.
Другая проблема - нарушение OCP: при добавлении новой фигуры приходится модифицировать существующую функцию, а не расширять её. Это делает код хрупким и сложным для тестирования.
Также часто игнорируют валидацию входных данных: не проверяют, что радиус или стороны положительные числа, не обрабатывают случай NaN или Infinity. Использование number без дополнительных guard-ов не защищает от некорректных значений.
Проблемы с типизацией: использование any для параметров, отсутствие readonly для входных массивов/объектов, неправильное применение as для приведения типов вместо proper type narrowing.
На практике
В production-коде лучше использовать discriminated union с явным перечислением всех возможных типов фигур. Для вычисления площади можно применить паттерн visitor или strategy, чтобы избежать больших switch/case. Важно добавить runtime-валидацию с помощью библиотек вроде zod или io-ts, если данные приходят из ненадёжных источников.
Для тестируемости стоит вынести логику вычисления каждой фигуры в отдельные функции, а основную функцию сделать диспетчером. Это упрощает unit-тестирование и добавление новых типов.
Пример кода
TYPESCRIPT// Плохой примерfunction calculateArea(shape: any): number {if (shape.type === 'circle') {return Math.PI * shape.radius * shape.radius;}if (shape.type === 'rectangle') {return shape.width * shape.height;}throw new Error('Unknown shape');}// Хороший примерtype Circle = { readonly kind: 'circle'; readonly radius: number };type Rectangle = { readonly kind: 'rectangle'; readonly width: number; readonly height: number };type Shape = Circle | Rectangle;function calculateArea(shape: Shape): number {switch (shape.kind) {case 'circle':if (shape.radius <= 0) throw new Error('Invalid radius');return Math.PI * shape.radius ** 2;case 'rectangle':if (shape.width <= 0 || shape.height <= 0) throw new Error('Invalid dimensions');return shape.width * shape.height;}}
Как отвечать на собеседовании
Начни с конкретного примера плохой реализации, затем объясни проблемы с точки зрения типизации и архитектуры. Покажи улучшенный вариант с discriminated union и валидацией. Упомяни trade-off между строгостью типов и runtime-проверками. Если спросят про расширяемость - предложи паттерн strategy или функциональный подход с map типов.
Что проверяет интервьюер
- Понимание discriminated unions и type narrowing
- Умение проектировать расширяемые типы
- Знание runtime-валидации и её отличий от compile-time проверок
- Способность видеть проблемы в коде с точки зрения SOLID
- Понимание, как TypeScript помогает (или не помогает) в runtime
Типичные ошибки
- Использование
interfaceс общим полемtype: stringвместо discriminated union - Применение
asдля обхода проверок типов - Отсутствие обработки отрицательных/нулевых значений
- Смешивание вычислений и валидации в одной функции
- Игнорирование
readonlyдля входных параметров - Использование
anyилиunknownбез proper narrowing
> Похожие задачи по frontend
Какие сущности TypeScript остаются в рантайме после транспиляции
Почему проверка типа через instanceof не работает с интерфейсами в TypeScript
Что такое типы any и unknown в TypeScript
Как сделать функцию getProperty с типизацией и проверкой ключей в TypeScript?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью