Naive UI — современная библиотека компонентов для Vue 3, полностью написанная на TypeScript, что обеспечивает строгую типизацию и высокую предсказуемость при разработке интерфейсов. При интеграции TypeScript с Naive UI часто возникают типовые ошибки, которые требуют внимательного анализа и понимания типовой системы Vue и самой библиотеки.
Property '...' does not exist on type '...'Эта ошибка возникает, когда TypeScript не может определить свойство,
переданное компоненту или объекту. В Naive UI это особенно часто
встречается при использовании пропсов компонентов.
Например, компонент NButton ожидает определённый набор
пропсов, и передача неподдерживаемого свойства вызовет:
const MyButton = () => <NButton color="primary" customProp="value" />
Ошибка:
Property 'customProp' does not exist on type 'ButtonProps'.
Решение:
<NButton color="primary" {...(myProps as Partial<ButtonProps>)} />
extends.ref
и реактивными объектамиВ Naive UI многие компоненты используют реактивные свойства Vue.
Проблемы возникают при попытке передать значение ref
напрямую, не учитывая тип:
const value = ref<string>('')
<NInput v-model:value={value} />
Ошибка
Type 'Ref<string>' is not assignable to type 'string'
может появиться при неправильной привязке через JSX/TSX.
Правильное использование:
.value при передаче или правильно типизировать
v-model:<NInput v-model:value={value.value} />
Ref<string> с
поддержкой v-model через DefineComponent.Type 'undefined' is not assignable to type '...'Многие компоненты Naive UI имеют обязательные пропсы. Если не задать их, TypeScript сообщит:
<NDatePicker v-model:value={selectedDate} />
Ошибка:
Type 'undefined' is not assignable to type 'Dayjs'.
Причины:
ref.Решение:
const selectedDate = ref<Dayjs>(dayjs())
? и проверять
наличие значения перед передачей.Naive UI поддерживает типизированные события, например
onUpdate:value для v-model. При передаче
функции с некорректной сигнатурой TypeScript выдаст ошибку:
<NInput onUpdate:value={(val: number) => console.log(val)} />
Ошибка:
Type '(val: number) => void' is not assignable to type '(value: string) => void'.
Решение:
<NInput onUpdate:value={(val: string) => console.log(val)} />
unknown
и кастинг после проверки:<NInput onUpdate:value={(val: unknown) => console.log(val as string)} />
Naive UI активно использует слоты. При использовании JSX/TSX или
<template> с TypeScript могут возникнуть ошибки:
<NCard v-slots={{ header: <div>{headerText}</div> }} />
Ошибка:
Type '{ header: Element; }' is not assignable to type 'Slots'.
Решение:
<NCard v-slots={{ header: () => <div>{headerText}</div> }} />
Naive UI предоставляет множество сложных интерфейсов, например для
NDataTable:
const columns: TableColumn[] = [
{ title: 'Name', key: 'name' },
{ title: 'Age', key: 'age', sorter: true },
]
Ошибка часто возникает при несоответствии типов ключей или сортировки:
Type '{ title: string; key: string; sorter: boolean; }' is not assignable to type 'TableColumn'.
Решение:
TableColumn<DataType>interface DataType {
name: string
age: number
}
const columns: TableColumn<DataType>[] = [
{ title: 'Name', key: 'name' },
{ title: 'Age', key: 'age', sorter: (a, b) => a.age - b.age },
]
any.ref всегда
учитывать .value.extends для кастомных
компонентов.Эти подходы позволяют максимально использовать преимущества строгой типизации TypeScript, предотвращая ошибки и упрощая масштабирование приложений с Naive UI.