【Vue】Vue3.0(十四)接口,泛型和自定义类型的概念及使用

上篇文章: 【Vue】Vue3.0(十三)中标签属性ref(加在普通标签上、加在组件标签上)、局部样式

🏡作者主页:点击!

🤖Vue专栏:点击!

⏰️创作时间:2024年10月20日12点50分

1、接口概念作用及定义

在 Vue 3 中,接口是一种用于定义对象形状的方式,它可以帮助我们确保组件接收正确的数据类型和结构。接口的使用可以提高代码的可读性和可维护性,特别是在涉及到组件之间的数据传递和交互时;

接口的定义
在 Vue 3 中,可以使用 TypeScript 来定义接口。接口使用interface关键字进行声明,后面跟着接口的名称(通常以大写字母I开头,这是一种命名约定,但不是必需的),然后是一对花括号,在花括号内定义接口的属性和方法。例如:

interface IUser {
  id: number;
  name: string;
  age: number;
}

在上述代码中,定义了一个名为IUser的接口,它描述了一个用户对象的形状,包含id、name和age三个属性,分别为数字类型、字符串类型和数字类型。

作用:比如我在其他的组件中想要创建一个Person类型的对象,那如果有这个标准规则了,如果创建的对象中的属性错误的话,那就会自动提示,让我们进行修改,以避免我们属性因为大意写错。
使用例子:
定义规则
在这里插入图片描述
使用规则定义变量
在这里插入图片描述
在这里插入图片描述

定义的personEx变量中有Interface种的属性,符合属性的名字和类型,所以不会提示错误,如果其中的name写成了name1,那就会提示红线,让我们进行修改。

2、泛型和自定义类型;比如可以规定一个数组中的元素的类型:

写法一:在定义具体变量的时候使用泛型


<script lang="ts" setup name="Person">
import {type personInter} from '@/types'
//let personEx:personInter={id:'1121212',name:'张三',age:18}
//console.log('personEx=',personEx);

//规定一个数组中的每一个元素都是person类型的规则
let persons:Array<personInter> =[  //在定义具体变量的时候使用了泛型
    {id:'1121211',name:'张三',age:18},
    {id:'1121213',name:'王五',age:19},
    {id:'1121215',name:'赵六',age:20}
]
console.log('persons=',persons);

</script>

写法二;在定义接口的时候,定义自定义类型就使用泛型

先定义 一个自定义类型:type

//定义自定义类型:一个Person数组中元素类型
export type persons = Array<personInter> //写法二
export type persons2=personInter[]//写法三

使用

<template>
    <div class="person">
        ???
    </div>
</template>

<script lang="ts" setup name="Person">
import { type personInter, type persons, type persons2 } from '@/types'
let personEx: personInter = { id: '1121212', name: '张三', age: 18 }
console.log('personEx=', personEx);

//方法一:规定一个数组中的每一个元素都是person类型的规则
let persons: Array<personInter> = [
    { id: '1121211', name: '张三', age: 18 },
    { id: '1121213', name: '王五', age: 19 },
    { id: '1121215', name: '赵六', age: 20 }
]
console.log('persons=', persons);

//方法二定义一个元素符合personInter规则的数组
let personList2: persons = [{ id: '1121211', name: '张三', age: 18 },
{ id: '1121213', name: '王五', age: 19 },
{ id: '1121215', name1: '赵六', age: 20 }]
console.log('personList2=', personList2);

//方法三 定义一个元素符合personInter规则的数组
let personList3: persons2 = [{ id: '1121211', name: '张三', age: 18 },
{ id: '1121213', name1: '王五', age: 19 },
{ id: '1121215', name: '赵六', age: 20 }]
console.log('personList3=', personList3);

</script>

<style scoped>
.person {
    background-color: skyblue;
    box-shadow: 0 0 10px;
    border-radius: 10px;
    padding: 20px;
}

li {
    font: 1em sans-serif;
}
</style>

结果:
在这里插入图片描述
如果编写代码的时候填写错误,也都会有错误提示:
在这里插入图片描述

<think>嗯,用户想了解在Vue3中如何创建使用组件来传递类。首先,我需要回忆Vue3组件的相关机制。根据提供的引用资料,特别是引用[3][4],Vue3结合TypeScript可以通过来提高类安全。例如,在引用[4]中,List组件使用来定义items的类,确保传入的数组符合Item接口的结构。 那组件在Vue3中的定义方式是什么呢?可能需要使用`defineComponent`并结合TypeScript的语法。在引用[3]中,Container类使用参数T,类似地,在组件中可能需要在props或setup函数中使用。不过Vue的单文件组件(SFC)结构可能需要特定的处理方式,比如在`<script setup>`中使用参数。 用户可能需要具体的示例,比如如何创建一个可以接受不同类数据的列表组件。这时候,需要定义一个组件,允许父组件传递不同类的数据,同时保持类检查。例如,在子组件中使用`<script setup lang="ts" generic="T">`来声明参数,然后在props中应用这个类。 另外,要注意在父组件中如何传递类并确保类正确。例如,引用[4]中的例子通过接口定义Item类,并在props中指定数组的类。如果使用,父组件可能需要显式指定类参数,或者在传递数据时由TypeScript自动推断。 还需要考虑Vue3的响应式系统如何处理,比如使用`ref`或`reactive`时是否会影响类推断。在引用[5]中,使用了`provide``ref`,这可能与结合使用时需要注意类声明。 最后,验证用户的问题是否涵盖定义、使用示例,可能需要分步骤解释,并给出代码示例,确保每个部分都符合Vue3TypeScript的最佳实践。同时,要检查是否有其他相关问题,比如性能优化或常见错误,但用户主要关注的是定义与使用,所以需要集中在这部分。</think>### Vue3 组件的定义与使用教程 在 Vue3 中,通过 TypeScript 的特性可以创建类安全的组件,支持灵活的类传递。以下是具体实现方法: --- #### 一、组件定义 使用 `<script setup>` 语法结合 `generic` 属性声明参数: ```vue <!-- GenericList.vue --> <script setup lang="ts" generic="T"> defineProps<{ items: T[] renderItem?: (item: T) => string }>() </script> <template> <ul> <li v-for="(item, index) in items" :key="index"> {{ renderItem ? renderItem(item) : item }} </li> </ul> </template> ``` --- #### 二、组件使用 父组件通过类推断或显式标注传递类: ```vue <!-- ParentComponent.vue --> <script setup lang="ts"> import GenericList from &#39;./GenericList.vue&#39; interface User { id: number name: string } const users = ref<User[]>([{ id:1, name:&#39;Alice&#39; }, { id:2, name:&#39;Bob&#39; }]) </script> <template> <!-- 类自动推断 --> <GenericList :items="users" :renderItem="u => u.name" /> <!-- 显式类标注 --> <GenericList<string> :items="[&#39;A&#39;, &#39;B&#39;, &#39;C&#39;]" /> </template> ``` --- #### 三、带约束的 通过 `extends` 添加类约束: ```vue <script setup lang="ts" generic="T extends { id: number }"> defineProps<{ data: T }>() </script> ``` --- #### 四、结合 Composition API 在 setup 函数中使用: ```vue <script setup lang="ts" generic="T"> const props = defineProps<{ value: T defaultValue: T }>() const currentValue = ref<T>(props.defaultValue) </script> ``` --- #### 实现原理 1. **类擦除**:信息仅在编译阶段存在,运行时会被擦除[^3] 2. **类推断**:TypeScript 编译器根据上下文自动推导参数[^4] 3. **Props 验证**:通过 `defineProps` 的参数实现编译时类检查[^1] --- #### 注意事项 1.使用 Vue 3.3+ 版本以获得完整支持 2.JSX/TSX 文件中需使用 `withDefaults` 处理默认值 3. 复杂类建议使用 `interface` 单独定义
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

执键行天涯、

码你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值