Element Plus предоставляет полноценную поддержку TypeScript, что позволяет использовать строгую типизацию компонентов, пропсов и событий. Правильное использование типов повышает надежность кода и улучшает автодополнение в редакторах.
Каждый компонент Element Plus имеет заранее определенные интерфейсы для своих пропсов. Например, для компонента ElButton тип пропсов определяется как:
import type { ButtonProps } from 'element-plus'
const props: ButtonProps = {
type: 'primary',
size: 'medium',
disabled: false,
}
Ключевые моменты:
type может быть
'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text'.size ограничен
'large' | 'medium' | 'small' | 'mini'.Компоненты Element Plus используют строго типизированные события. Для компонента ElInput это выглядит так:
import type { InputEmits } from 'element-plus'
const handleInput = (value: string) => {
console.log(value)
}
const emits: InputEmits = {
input: handleInput
}
Особенности:
Слоты в Element Plus также поддерживают TypeScript. Например, для компонента ElTable:
import type { TableColumnCtx } from 'element-plus'
<el-table :data="tableData">
<el-table-column prop="name" label="Имя">
<template #default="{ row }">
<span>{{ (row as TableColumnCtx).name }}</span>
</template>
</el-table-column>
</el-table>
Особенности:
defineComponent и Generic типовДля полного контроля типов компонентов рекомендуется использовать
defineComponent с указанием Generic типов пропсов, слотов и
событий:
import { defineComponent } from 'vue'
import type { ButtonProps, ButtonEmits } from 'element-plus'
export default defineComponent<ButtonProps, {}, ButtonEmits>({
props: {
type: String,
size: String,
},
emits: ['click'],
setup(props, { emit }) {
const handleClick = () => emit('click')
return { handleClick }
}
})
Преимущества:
В случаях создания оберток над Element Plus компонентами рекомендуется создавать свои интерфейсы:
import type { SelectProps } from 'element-plus'
interface CustomSelectProps extends SelectProps {
customOptionStyle?: string
}
export default defineComponent<CustomSelectProps>({
props: {
customOptionStyle: String,
},
})
Плюсы подхода:
Для компонентов, работающих с массивами данных, можно использовать обобщения:
import type { TableProps } from 'element-plus'
interface User {
id: number
name: string
email: string
}
const tableProps: TableProps<User> = {
data: [
{ id: 1, name: 'Иван', email: 'ivan@example.com' }
],
}
Выводы по динамическим типам:
Библиотека предоставляет типы для утилит, например, для уведомлений:
import { ElNotification } from 'element-plus'
import type { NotificationParams } from 'element-plus'
const options: NotificationParams = {
title: 'Успех',
message: 'Операция выполнена',
type: 'success',
}
ElNotification(options)
type: 'errorr'.Эти подходы к типизации позволяют максимально безопасно использовать все возможности Element Plus в проектах на TypeScript, снижая количество ошибок и обеспечивая удобство разработки.