> Как задать значение по умолчанию для defineProps во Vue с TypeScript (Vue.js)
Уровень: senior · Роль: frontend · Категория: Технические вопросы
Компании: Библио-Глобус
Стек: Vue.js
> Пример ответа
Короткий ответ
Во Vue 3 с TypeScript значение по умолчанию для defineProps задаётся через опцию default в объекте, передаваемом вторым аргументом. Для типизированных props используется синтаксис defineProps<{ prop?: Type }>() с withDefaults для указания значений по умолчанию. Это обеспечивает корректную типизацию и runtime-значения.
Подробное объяснение
defineProps - это макрос компилятора Vue, который декларирует props компонента. При использовании TypeScript есть два подхода: runtime-декларация (объект с типами) и чисто типовая декларация (generic). Для задания значений по умолчанию в типовом подходе применяется withDefaults, так как TypeScript не может вывести runtime-значения из типа. withDefaults принимает результат defineProps и объект с дефолтами, сохраняя типизацию. В runtime-подходе default указывается прямо в объекте prop'а. Важно: withDefaults работает только с типовым синтаксисом и не влияет на типы - он просто добавляет runtime-логику.
На практике
Для типового подхода используйте withDefaults после defineProps. Для runtime-подхода - объект с type и default. Выбор зависит от потребности в строгой типизации: типовой подход даёт лучший автокомплит и проверки, но требует дополнительного импорта. Runtime-подход проще для смешанных проектов. Если prop обязателен, значение по умолчанию не нужно. Для объектов и массивов default должен быть функцией-фабрикой, чтобы избежать мутаций.
Пример кода
TYPESCRIPT// Типовой подход с withDefaultsimport { defineProps, withDefaults } from 'vue'interface Props {title?: stringcount?: numberitems?: string[]}const props = withDefaults(defineProps<Props>(), {title: 'Default Title',count: 0,items: () => [] // фабрика для объектов/массивов})// Runtime-подходconst props = defineProps({title: {type: String,default: 'Default Title'},count: {type: Number,default: 0},items: {type: Array as PropType<string[]>,default: () => []}})
Как отвечать на собеседовании
Начни с чёткого ответа: используй withDefaults для типового синтаксиса. Объясни разницу между runtime и типовым подходами, упомяни фабрики для объектов. Покажи пример кода. Подчеркни, что withDefaults сохраняет типы, а runtime-подход требует PropType для сложных типов. Будь готов обсудить trade-off: типовой подход строже, но требует больше кода.
Что проверяет интервьюер
Интервьюер оценивает знание макросов Vue 3, понимание TypeScript в контексте Vue, умение работать с типами и runtime-логикой. Также проверяется способность объяснить разницу между подходами и избежать типичных ошибок, таких как мутация общих объектов.
Типичные ошибки
- Забывают про фабрику для объектов/массивов, что приводит к мутациям между экземплярами.
- Используют
withDefaultsс runtime-синтаксисом - это не работает. - Указывают
defaultдля обязательных props, что избыточно. - Не импортируют
withDefaultsиз 'vue', полагаясь на автоматическую регистрацию.
> Похожие задачи по frontend
Почему выбрали Vue и учитывали ли преимущества инструментов
Что такое ViewModel во Vue и как он работает
Что такое reactive и ref во Vue Composition API, для чего они нужны и чем отличаются?
Что делает extends в TypeScript и зачем он нужен?
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью