【愚公系列】《鸿蒙原生应用开发从零基础到多实战》006-TypeScript 中的元组
标题 | 详情 |
---|---|
作者简介 | 愚公搬代码 |
头衔 | 华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。 |
近期荣誉 | 2022年度博客之星TOP2,2023年度博客之星TOP2,2022年华为云十佳博主,2023年华为云十佳博主,2024年华为云十佳博主等。 |
博客内容 | .NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。 |
欢迎 | 👍点赞、✍评论、⭐收藏 |
文章目录
- 🚀前言
- 🚀一、🌟 TypeScript 核心特性详解:元组、枚举与面向对象编程
- 🔎1.数组与元组的本质区别
- 🔎2.元组深度解析
- 🦋2.1 元组操作规范
- 🦋2.2 元组解构应用
- 🔎3.枚举类型实战
- 🦋3.1 基础枚举定义
- 🦋3.2 显式值设置
- 🔎4.面向对象编程实践
- 🦋4.1 接口与抽象类
- 🦋4.2 具体类实现
- 🦋4.3 实例化与使用
- 🔎5.关键概念解析
- 🔎6.调试与优化建议
🚀前言
在现代JavaScript和TypeScript的开发中,数据结构的灵活性和强类型特性显得尤为重要。元组(Tuple)作为TypeScript的一种独特数据结构,为我们提供了一种强大的方式来处理和组织不同类型的数据。与数组类似,元组可以存储多个值,但与数组不同的是,元组的每个元素可以具有不同的数据类型,并且其长度是固定的。这一特性使得元组在处理复杂数据时,尤其是在函数参数、API响应等场景中,展现出了极大的便利性。
在本文中,我们将深入探讨TypeScript中的元组,包括其基本概念、定义方式及应用实例。通过具体的代码示例,你将学习到如何创建元组,如何访问和修改元组中的数据,以及在实际开发中如何灵活运用元组来提高代码的可读性和可维护性。
🚀一、🌟 TypeScript 核心特性详解:元组、枚举与面向对象编程
🔎1.数组与元组的本质区别
特性 | 数组 (Array) | 元组 (Tuple) |
---|---|---|
元素类型 | 单一类型(any[]允许混合类型) | 固定顺序的多类型组合 |
类型声明 | number[] 或 Array<string> | [类型1, 类型2,...] |
越界处理 | 自动扩展为数组类型 | 扩展元素需满足联合类型 |
典型应用 | 同质数据集合(如用户ID列表) | 异构数据结构(如API返回状态码+消息体) |
代码对比:
// 数组
const numArr: number[] = [1, 2, 3];
const mixedArr: (string | number)[] = ['a', 1];
// 元组
let userInfo: [number, string, boolean] = [1, 'admin', true];
🔎2.元组深度解析
🦋2.1 元组操作规范
// 正确定义
let point: [number, number] = [10, 20];
// 类型顺序错误
point = ['x', 30]; // ❌ Type 'string' is not assignable to 'number'
// 越界赋值(联合类型生效)
point.push(30); // ✅ 合法,但无法通过索引访问point[2]
🦋2.2 元组解构应用
const response: [number, string] = [200, 'OK'];
const [statusCode, message] = response;
console.log(`状态码: ${statusCode}, 消息: ${message}`);
🔎3.枚举类型实战
🦋3.1 基础枚举定义
// 数值型枚举(默认从0开始)
enum Direction { Up, Down, Left, Right }
// 字符串枚举
enum LogLevel {
Info = 'INFO',
Error = 'ERROR'
}
// 混合枚举(不推荐)
enum Status {
Success = 200,
Fail = 'FAIL'
}
🦋3.2 显式值设置
// 显式赋值示例
enum Gear {
First = 1, // 显式设置为1
Second = 3, // 跳跃赋值
Third = 5
}
console.log(Gear.Second); // 输出: 3
🔎4.面向对象编程实践
🦋4.1 接口与抽象类
// 驾驶行为接口
interface Drivable {
start(): void;
drive(time: number, speed: Gear): void;
getKilometer(): number;
}
// 抽象类实现接口
abstract class Car implements Drivable {
protected _isRunning: boolean = false;
protected _distance: number = 0;
public start(): void {
this._isRunning = true;
}
public abstract drive(time: number, speed: Gear): void;
public getKilometer(): number {
return this._distance;
}
}
🦋4.2 具体类实现
// BMW子类(泛型应用)
class BMW<T extends Color> extends Car {
private color: T;
constructor(colorType: T) {
super();
this.color = colorType;
}
public drive(time: number, speed: Gear): void {
if (this._isRunning) {
this._distance += time * speed;
}
}
public getColor(): string {
return Color[this.color];
}
}
🦋4.3 实例化与使用
// 实例创建与操作
const myBMW = new BMW(Color.Red);
myBMW.start();
myBMW.drive(2, Gear.First); // 2小时 × 1档速度
myBMW.drive(1.5, Gear.Third); // 1.5小时 × 5档速度
// DOM输出
document.body.innerHTML = `
总里程: ${myBMW.getKilometer()}km
颜色: ${myBMW.getColor()}
`;
🔎5.关键概念解析
-
联合类型 (
|
)
允许变量为多种类型之一:let value: string | number
-
泛型约束 (
<T extends Type>
)
确保泛型参数符合特定类型要求 -
访问修饰符
public
: 默认可见性protected
: 仅类及子类可访问private
: 仅类内部可访问
-
抽象类特性
- 不可直接实例化
- 必须实现接口中的抽象方法
- 可包含具体方法实现
🔎6.调试与优化建议
-
元组类型安全
使用readonly
修饰防止意外修改:const config: readonly [string, number] = ['localhost', 8080];
-
枚举反向映射
数值型枚举支持反向查找:enum Gear { First = 1 } console.log(Gear[1]); // 输出: "First"
-
性能优化
频繁创建对象时考虑对象池模式