TS中的接口、泛型、自定义类型 与vue3的使用

泛型的使用场景:

当我们定义了一个对象时,在多次传值的过程中,其对象中的属性值被更改了,以至于后期拿不到我们需要的数据。

举个例子,当我们使用person.name时,是可以使用的。但是多次传递之后,属性值写成naem,此时我们使用person.name是不生效的!!!

现在我们对数据,进行限制,使用泛型或者接口的形式,确保数据的安全:

正常定义一个person对象类型:

html 复制代码
<script lang="ts"" setup name="TsPerson">

let person={
    age:18,
    id:"1",
    name:"张三"
}
</script>

此时的数据是不安全的!!!

接口约束

现在我们定义一个接口:

目录在src/types/index.ts

XML 复制代码
//定义一个接口,用于限制person对象的具体属性
export interface PersonInterface {
    id:string,
    name:string,
    age:number
}

我们需要将数据进行导入:

XML 复制代码
<script lang="ts"" setup name="TsPerson">
import { type PersonInterface } from "@/types"; //@指从src路径开始 
//使用泛型显示对象的属性
let person:PersonInterface ={
    age:18,
    id:"1",
    name:"张三"
}

</script>

此时的对象就是被约束过的,id、name都是string类型

现在需求升级了,我们需要以上PersonInterface接口类型的数据数组

我们可以直接使用之前我们定义的接口类型,指定我们创建对象,需要创建什么样的数组就行:

XML 复制代码
<script lang="ts"" setup name="TsPerson">

import { type PersonInterface } from "@/types"; //@指从src路径开始 

//使用泛型定义数组对象
// 方式一:
let personArray:Array<PersonInterface> = [
    {id:"123",name:"张三",age:18},
    {id:"234",name:"李四",age:19},
    {id:"456",name:"王五",age:20}
]

// 方式二:
let personList:PersonInterface[] = [
    {id:"123",name:"张三",age:18},
    {id:"234",name:"李四",age:19},
    {id:"456",name:"王五",age:20}
]

</script>

我们可以换种写法:

自定义类型约束

首先,我们在之前创建的文件中,创建自定义的类型type,

切记一定要export否则,在另一个文件中不能引入该类型

XML 复制代码
//定义一个接口,用于限制person对象的具体属性
export interface PersonInterface {
    id:string,
    name:string,
    age:number
}

//自定义类型
// 定义数组的两种方式
export type Persons = PersonInterface[]

export type PersonArray = Array<PersonInterface>

export interface PersonListInterface{  //定义一个接口
    list:PersonInterface[]
}

在文件中进行引入:

XML 复制代码
<script lang="ts"" setup name="TsPerson">
// import {type PersonInterface,type PersonListInterface,type Persons,type personArray} from "../../types/index"
import { type PersonInterface, type PersonListInterface,type Persons,type PersonArray } from "@/types"; //@指从src路径开始 ,与上面语法等价

//方式三:
let personList2:Persons = [
    {id:"123",name:"张三",age:18},
    {id:"234",name:"李四",age:19},
    {id:"456",name:"王五",age:20}
]

//方式四:
let personList3:PersonArray = [
    {id:"123",name:"张三",age:18},
    {id:"234",name:"李四",age:19},
    {id:"456",name:"王五",age:20}
]


//方式五:
let personList4:PersonListInterface = {
    list:[
        {id:"123",name:"张三",age:18},
        {id:"234",name:"李四",age:19},
        {id:"456",name:"王五",age:20}
    ]
}
</script>

测试:

当我们不小心写错时,会给出相应的提示信息!

扩展知识:

在script标签中导入外部文件时,我们可以使用 @ 快速定位到src目录,例如

java 复制代码
import {type PersonInterface} from "../../types/index"
import { type PersonInterface} from "@/types"; //@指从src路径开始 ,与上面语法等价

在style标签中导入外部文件时,我们可以使用 @import进行导入,但是并不是从src目录开始的

,但是下面是等价的!

java 复制代码
@import "/src/Css/divBox.css"; 
@import "../../Css/divBox.css"

响应式对象如何限制泛型?

首先尝试,基于之前限制的使用方式:

html 复制代码
<script lang="ts" setup name="Father">
import { reactive } from "vue";
import child from "./child.vue";
import {type Persons } from "@/types/index"

//这种方式不建议使用
let person:Persons = reactive([
  {id:"1",da:"张三",age:18},
  {id:"2",name:"李四",age:19},
  {id:"3",name:"王五",age:20},
])

</script>

此时提示(大概意识是你不能将一个类型的数据,赋值给另一个数据对象):

限制我们使用泛型的方式进行限制:

html 复制代码
<script lang="ts" setup name="Father">
import { reactive } from "vue";
import child from "./child.vue";
import {type Persons } from "@/types/index"

//推荐指数*****
let personList = reactive<Persons>([
  {id:"1",sd:"张三",age:18},
  {id:"2",name:"李四",age:19},
  {id:"3",name:"王五",age:20},
])

</script>

查看,提示很清晰,:

相关推荐
佛山个人技术开发6 分钟前
个人建站接单|汽车汽配行业宽屏自适应官网模板 工厂企业定制建站源码
前端·css·前端框架·html·汽车·php
光影少年17 分钟前
react的Context 和 Redux 区别?
前端·javascript·react.js·前端框架
前端 贾公子24 分钟前
uni-app工程化实战:基于vue-i18n和i18n-ally的国际化方案 (上)
前端·javascript·vue.js
喵个咪39 分钟前
基于 Flutter 的 Headless CMS 全平台前端架构:技术解析与二次开发导引
前端·flutter·cms
vim怎么退出1 小时前
Dive into React——Diff 算法
前端·react.js·源码阅读
半个落月1 小时前
面试必问的 JS 原型链,我用 16 个示例给你彻底讲明白
javascript
拾年2751 小时前
别调 BERT 了:我用 Prompt 做了套 NLP 系统,20 分钟搞定
前端·人工智能
丷丩1 小时前
12. 渲染:MapLibre GL JS 集成与多源瓦片联动
javascript·矢量瓦片·maplibre gl js·地图服务器
半个落月1 小时前
别再死记变量提升了——从 V8 编译过程真正理解 JS 执行机制
前端
橘子星2 小时前
别再懵圈!JS 执行机制的 “千层套路” 全揭秘
前端·javascript