Vue 3 中的 TypeScript:接口、自定义类型与泛型
在 Vue 3 中,TypeScript 提供了强大的类型系统,帮助我们更好地管理代码的类型安全。通过使用 接口(Interface)、自定义类型(Type Aliases) 和 泛型(Generics),我们可以编写更清晰、更健壮的代码。本文将详细介绍这些概念,并通过优化后的代码示例来演示它们的实际应用。
1. 接口(Interface)
接口是 TypeScript 中定义对象结构的主要方式。它描述了对象的形状,包括属性的名称和类型。
1.1 定义接口
export interface Person {id: string;name: string;age: number;
}
Person接口:- 定义了一个包含
id、name和age属性的对象结构。 - 每个属性都有明确的类型。
- 定义了一个包含
1.2 使用接口
let person: Person = { id: "1", name: "张三", age: 18 };
person对象:- 必须符合
Person接口的结构。 - 如果缺少某个属性或类型不匹配,TypeScript 会报错。
- 必须符合
2. 自定义类型(Type Aliases)
自定义类型允许我们为复杂的类型定义一个别名,使代码更具可读性。
2.1 定义自定义类型
// 使用 Array<Person> 或 Person[] 定义 Persons 类型
export type Persons = Person[];
Persons类型:- 表示一个
Person对象的数组。 - 可以使用
Array<Person>或Person[]两种写法。
- 表示一个
2.2 使用自定义类型
let personList: Persons = [{ id: "1", name: "张三", age: 18 },{ id: "2", name: "李四", age: 19 },{ id: "3", name: "王五", age: 20 },{ id: "4", name: "赵六", age: 21 },
];
personList数组:- 必须是一个
Person对象的数组。 - 每个元素都必须符合
Person接口的结构。
- 必须是一个
3. 泛型(Generics)
泛型允许我们编写可重用的代码,适用于多种类型。它通过参数化类型来实现。
3.1 使用泛型定义数组
let personList2: Array<Person> = [{ id: "1", name: "张三", age: 18 },{ id: "2", name: "李四", age: 19 },{ id: "3", name: "王五", age: 20 },{ id: "4", name: "赵六", age: 21 },
];
Array<Person>:- 表示一个
Person对象的数组。 - 泛型
Array<T>可以用于任何类型T。
- 表示一个
3.2 泛型的优势
- 类型安全:确保数组中的每个元素都符合指定的类型。
- 代码复用:可以用于多种类型,而无需重复定义。
4. 优化后的代码示例
以下展示了如何在 Vue 3 中使用接口、自定义类型和泛型。
4.1 定义类型文件(types.ts)
// 定义 Person 接口
export interface Person {id: string;name: string;age: number;
}// 定义 Persons 类型
export type Persons = Person[];
4.2 使用类型文件(Person.vue)
<template><div><h1>人员信息</h1><ul><li v-for="p in personList" :key="p.id">{{ p.name }} - {{ p.age }} 岁</li></ul></div>
</template><script setup lang="ts">
import { type Person, type Persons } from "@/types";// 定义单个 Person 对象
let person: Person = { id: "1", name: "张三", age: 18 };// 定义 Person 数组(使用自定义类型)
let personList: Persons = [{ id: "1", name: "张三", age: 18 },{ id: "2", name: "李四", age: 19 },{ id: "3", name: "王五", age: 20 },{ id: "4", name: "赵六", age: 21 },
];// 定义 Person 数组(使用泛型)
let personList2: Array<Person> = [{ id: "1", name: "张三", age: 18 },{ id: "2", name: "李四", age: 19 },{ id: "3", name: "王五", age: 20 },{ id: "4", name: "赵六", age: 21 },
];console.log(person);
</script><style scoped>
ul {list-style-type: none;padding: 0;
}li {margin: 10px 0;font-size: 18px;
}
</style>
4.3 代码解析
-
类型定义:
- 在
types.ts中定义了Person接口和Persons类型。 - 通过
import引入类型并在组件中使用。
- 在
-
数据定义:
- 使用
Person接口定义单个对象person。 - 使用
Persons类型和Array<Person>泛型定义数组personList和personList2。
- 使用
-
模板渲染:
- 使用
v-for遍历personList并渲染人员信息。
- 使用
-
样式优化:
- 使用
scoped样式确保样式只作用于当前组件。
- 使用
5. 总结
-
接口(Interface):
- 用于定义对象的结构,确保类型安全。
-
自定义类型(Type Aliases):
- 用于为复杂类型定义别名,提高代码可读性。
-
泛型(Generics):
- 用于编写可重用的代码,适用于多种类型。
通过本文的介绍和优化后的代码示例,希望你能更好地理解 Vue 3 中 TypeScript 的类型系统,并在实际项目中灵活运用接口、自定义类型和泛型来提升代码质量!
相关文章:
Vue 3 中的 TypeScript:接口、自定义类型与泛型
在 Vue 3 中,TypeScript 提供了强大的类型系统,帮助我们更好地管理代码的类型安全。通过使用 接口(Interface)、自定义类型(Type Aliases) 和 泛型(Generics),我们可以编…...
计算机组成原理(计算机系统3)--实验七:新增指令实验
一、实验目标 了解RISC-V mini处理器架构,在其基础之上新增一个指令,完成设计并观察指令执⾏。 二、实验内容 1) 修改数据通路,新增指令comb rs1,rs2,rd采用R型指令格式,实现将rs1高16位和rs2低16位拼接成32位整数,…...
LeetCode 0040.组合总和 II:回溯 + 剪枝
【LetMeFly】40.组合总和 II:回溯 剪枝 力扣题目链接:https://leetcode.cn/problems/combination-sum-ii/ 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates…...
解决使用Selenium时ChromeDriver版本不匹配问题
在学习Python爬虫过程中如果使用Selenium的时候遇到报错如下session not created: This version of ChromeDriver only supports Chrome version 99… 这说明当前你的chrome驱动版本和浏览器版本不匹配。 例如 SessionNotCreatedException: Message: session not created: This…...
CAN波特率匹配
STM32 LinuxIMX6ull(Linux)基于can-utils测试...
JVM垃圾回收器的原理和调优详解!
全文目录: 开篇语前言摘要概述垃圾回收器分类及原理1. Serial 垃圾回收器2. Parallel 垃圾回收器3. CMS 垃圾回收器4. G1 垃圾回收器 源码解析示例代码 使用案例分享案例 1:Web 服务的 GC 调优案例 2:大数据任务的 GC 优化 应用场景案例垃圾回…...
与机器学习相关的概率论重要概念的介绍和说明
概率论一些重要概念的介绍和说明 1、 试验 (1)试验是指在特定条件下,对某种方法、技术、设备或产品(即,事物)进行测试或验证的过程。 (2)易混淆的概念是,实验。实验&…...
JavaScript中的相等运算符:`==`与`===`
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…...
A7. Jenkins Pipeline自动化构建过程,可灵活配置多项目、多模块服务实战
服务容器化构建的环境配置构建前需要解决什么下面我们带着问题分析构建的过程:1. 如何解决jenkins执行环境与shell脚本执行环境不一致问题?2. 构建之前动态修改项目的环境变量3. 在通过容器打包时避免不了会产生比较多的不可用的镜像资源,这些资源要是不及时删除掉时会导致服…...
66-《虞美人》
虞美人 虞美人(学名:Papaver rhoeas L.):一年生草本植物,全体被伸展的刚毛,稀无毛。茎直立,高25-90厘米,具分枝。叶片轮廓披针形或狭卵形,羽状分裂,裂片披针形…...
obsidian插件——Metadata Hider
原本是要找导出图片时显示属性的插件,奈何还没找到,反而找到了可以隐藏属性的插件。唉,人生不如意,十之八九。 说一下功能: 这个插件可以把obsidian的文档属性放在右侧显示,或者决定只显示具体几项属性&a…...
MySQL中InnoDB逻辑存储结构
在MySQL中,InnoDB是最常用的存储引擎之一,它具有高度的事务支持、行级锁、ACID特性以及自动崩溃恢复等特性。InnoDB的逻辑存储结构可以分为多个层次,下面是详细的解析。 1. 表空间 (Tablespace) InnoDB的物理存储结构以表空间为基础。表空间…...
高阶C语言|深入理解字符串函数和内存函数
文章目录 前言1.求字符串长度1.1 字符串长度函数:strlen模拟实现 长度不受限制的字符串函数1.2 字符串拷贝函数:strcpy模拟实现 1.3 字符串连接函数:strcat模拟实现 1.4 字符串比较函数:strcmp模拟实现 长度受限制的字符串函数2.1…...
Pandas DataFrame 拼接、合并和关联
拼接:使用 pd.concat(),可以沿着行或列方向拼接 DataFrame。 合并:使用 pd.merge(),可以根据一个或多个键进行不同类型的合并(左连接、右连接、全连接、内连接)。 关联:使用 join() 方法,通常在设置了索引的 DataFrame 上进行关联操作。 concat拼接 按列拼接 df1 = …...
特种作业操作之低压电工考试真题
1.下面( )属于顺磁性材料。 A. 铜 B. 水 C. 空气 答案:C 2.事故照明一般采用( )。 A. 日光灯 B. 白炽灯 C. 压汞灯 答案:B 3.人体同时接触带电设备或线路中的两相导体时,电流从一相通过人体流…...
“Play around” 在编程领域的含义
“Play around” 的含义 If everything is working correctly we should have a play around in the prompt and verify that functions are actually a new type of value now, not symbols. https://www.buildyourownlisp.com/chapter11_variables 在这段话中,“p…...
[免费]基于Python的Django博客系统【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的基于Python的Django博客系统,分享下哈。 项目视频演示 【免费】基于Python的Django博客系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随着互联网技术的飞速发展,信息的传播与…...
通过protoc工具生成proto的pb.go文件以及使用protoc-go-inject-tag工具注入自定义标签
1.ProtoBuf认识,安装以及用法 参考:[golang 微服务] 3. ProtoBuf认识,安装以及golang 中ProtoBuf使用 2. 使用protoc-go-inject-tag工具注入自定义标签 这里有一个案例: syntaxproto3; package test;option go_package ".;test";message MyMessage {int6…...
进程池的制作(linux进程间通信,匿名管道... ...)
目录 一、进程间通信的理解 1.为什么进程间要通信 2.如何进行通信 二、匿名管道 1.管道的理解 2.匿名管道的使用 3.管道的五种特性 4.管道的四种通信情况 5.管道缓冲区容量 三、进程池 1.进程池的理解 2.进程池的制作 四、源码 1.ProcessPool.hpp 2.Task.hpp 3…...
Gurobi 基础语法之 tupledict 和 tuplelist
Python中的字典:dict 我们先来介绍一下Python语法中的 dict 类型, 字典中可以通过任意键值来对数据进行映射,任何无法修改的python对象都可以当作键值来使用,这些无法修改的Python对象包括:整数(比如:1),浮…...
Flutter:搜索页,搜索bar封装
view 使用内置的Chip简化布局 import package:chenyanzhenxuan/common/index.dart; import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:tdesign_flutter/tdesign_flutter.dart;import i…...
IoTDB 2025 春节值班与祝福
2025 春节快乐 瑞蛇迎吉庆,祥光映华年,2025 春节已近在眼前。社区祝福 IoTDB 的所有关注者、支持者、使用者 2025 新年快乐,“蛇”来运转! IoTDB 团队的春节放假时间为 2025 年 1 月 27 日至 2 月 4 日,1 月 25 日、26…...
14、Java 对象关系映射(ORM)框架:简化数据库操作的利器
嘿,Java 开发者们!在我们的编程旅程中,经常会遇到一个重要的任务,那就是将 Java 对象和数据库表进行交互。传统的 JDBC 编程虽然强大,但代码往往会变得繁琐且容易出错。这时候,对象关系映射(ORM…...
鲁滨逊漂流记读后感
前言:学校要求出鲁滨逊漂流记的读后感啊,那么今天我就写着试试叭,好久都没更新了嘤,可能写的不好嗷。真的不是很建议参考,因为我的思想可能会与学校的要求不同,更多的是介入了自己的思考,从鲁滨逊好的地方和…...
【面试】【前端】前端网络面试题总结
一、前端网络面试题总结 网络相关知识是前端开发的核心内容之一,面试中通常会考察协议、网络模型、性能优化及常见网络问题的处理。以下是针对前端网络面试题的总结: (一)协议森林(大话网络协议) 网络协议…...
【MQ】如何保证消息队列的高性能?
零拷贝 Kafka 使用到了 mmap 和 sendfile 的方式来实现零拷贝。分别对应 Java 的 MappedByteBuffer 和 FileChannel.transferTo 顺序写磁盘 Kafka 采用顺序写文件的方式来提高磁盘写入性能。顺序写文件,基本减少了磁盘寻道和旋转的次数完成一次磁盘 IO࿰…...
刀客doc:禁令影响下,TikTok广告业务正在被对手截胡
一、 现如今,TikTok在美国的命运迎来了暂时的反转,根据Adage的报道,广告主的投放在恢复。但短暂的关闭带来的影响依然有余震,一些广告主在重新评估TikTok在自己广告预算中的地位,这些是竞争对手截胡的机会。 长期以…...
中国电信AI大模型发布:评分超o1-preview,近屿智能带您探索AI技术新境界
近日,中国电信人工智能研究院宣布,其自主研发的复杂推理大模型TeleAI-t1-preview即将上线天翼AI开放平台。该模型采用强化学习训练方法,显著提升了逻辑推理和数学推导的准确性,展现了强大的复杂问题解决能力。 在权威评测中&#…...
服务定位器模式
服务定位器模式 引言 服务定位器模式(Service Locator Pattern)是一种设计模式,旨在解决应用程序中服务管理的问题。它通过提供一个中央服务注册中心,将服务提供者与服务消费者解耦,从而简化了服务的查找和依赖管理。…...
开发环境搭建-4:WSL 配置 docker 运行环境
在 WSL 环境中构建:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统(UnionFS)、命名空间(namespace)、权限管理(cgroup),虚拟出一…...
