Typescript学习教程,从入门到精通,TypeScript 对象语法知识点及案例代码(7)

TypeScript 对象语法知识点及案例代码

TypeScript 是 JavaScript 的超集,提供了静态类型检查和其他增强功能。在 TypeScript 中,对象是面向对象编程(OOP)的基础。


一、对象概述

在 TypeScript 中,对象是属性的集合,每个属性都有名称和值。对象可以包含原始值、函数、数组,甚至其他对象。TypeScript 通过接口(Interfaces)和类型别名(Type Aliases)来定义对象的结构,从而实现类型检查。

1.1 对象的创建

对象可以通过 对象字面量构造函数 来创建。


二、语法知识点

2.1 对象字面量

使用花括号 {} 来定义对象,并使用 key: value 的形式来添加属性。

// 定义一个对象字面量
let person: { name: string; age: number } = {name: "Alice",age: 30,
};

2.2 接口(Interfaces)

接口用于定义对象的结构,确保对象符合特定的类型。

// 定义一个接口
interface Person {name: string;age: number;greet: () => void;
}// 使用接口创建对象
let person: Person = {name: "Bob",age: 25,greet: function () {console.log(`Hello, my name is ${this.name}`);},
};

2.3 可选属性

接口中的属性可以设置为可选的,使用 ? 符号。

interface Person {name: string;age?: number; // 可选属性
}let person: Person = {name: "Charlie",// age 属性是可选的,可以省略
};

2.4 只读属性

使用 readonly 关键字定义只读属性,属性值只能在对象创建时赋值。

interface Person {readonly id: number;name: string;
}let person: Person = {id: 1,name: "Diana",
};// 尝试修改只读属性会报错
// person.id = 2; // Error

2.5 索引签名

允许对象有动态属性名,使用索引签名定义。

interface StringMap {[key: string]: string;
}let map: StringMap = {firstName: "Eve",lastName: "Adams",
};

2.6 继承接口

接口可以继承其他接口,扩展其属性。

interface Animal {name: string;
}interface Dog extends Animal {breed: string;
}let dog: Dog = {name: "Buddy",breed: "Golden Retriever",
};

2.7 类型别名(Type Aliases)

使用 type 关键字定义类型别名,可以用于对象类型。

type Person = {name: string;age: number;
};let person: Person = {name: "Frank",age: 40,
};

2.8 联合类型与交叉类型

  • 联合类型(Union Types):表示一个值可以是几种类型之一,使用 | 符号。
  • 交叉类型(Intersection Types):表示一个值同时具有几种类型的属性,使用 & 符号。
type Bird = {wings: number;
};type Fish = {fins: number;
};// 联合类型
let pet: Bird | Fish = {wings: 2,// 或者 fins: 4,
};// 交叉类型
let creature: Bird & Fish = {wings: 2,fins: 4,
};

2.9 泛型对象

使用泛型定义通用的对象类型。

interface Box<T> {value: T;
}let numberBox: Box<number> = {value: 10,
};let stringBox: Box<string> = {value: "Hello",
};

三、案例代码

以下是一些具体的案例代码,展示了如何在 TypeScript 中创建和使用对象。

案例 1:基本对象创建与访问

// 定义一个接口
interface User {id: number;username: string;email: string;isActive: boolean;
}// 创建用户对象
let user: User = {id: 1,username: "john_doe",email: "john@example.com",isActive: true,
};// 访问对象的属性
console.log(`User ID: ${user.id}`);
console.log(`Username: ${user.username}`);
console.log(`Email: ${user.email}`);
console.log(`Is Active: ${user.isActive}`);

输出:

User ID: 1
Username: john_doe
Email: john@example.com
Is Active: true

案例 2:可选属性与只读属性

// 定义一个接口,包含可选属性和只读属性
interface Product {id: number;name: string;price?: number; // 可选属性readonly createdAt: Date;
}// 创建产品对象
let product: Product = {id: 101,name: "Laptop",createdAt: new Date(),
};// 访问可选属性
if (product.price) {console.log(`Price: $${product.price}`);
} else {console.log("Price not available.");
}// 尝试修改只读属性会报错
// product.createdAt = new Date(); // Error// 修改其他属性
product.price = 999.99;
console.log(`Updated Price: $${product.price}`);

输出:

Price not available.
Updated Price: $999.99

案例 3:索引签名

// 定义一个接口,使用索引签名
interface Dictionary {[key: string]: string;
}// 创建字典对象
let dictionary: Dictionary = {apple: "苹果",banana: "香蕉",orange: "橙子",
};// 访问字典中的值
console.log(`Apple in Chinese: ${dictionary.apple}`);
console.log(`Banana in Chinese: ${dictionary.banana}`);
console.log(`Orange in Chinese: ${dictionary.orange}`);

输出:

Apple in Chinese: 苹果
Banana in Chinese: 香蕉
Orange in Chinese: 橙子

案例 4:继承接口

// 定义基类接口
interface Animal {name: string;age: number;
}// 定义派生接口,继承自 Animal
interface Dog extends Animal {breed: string;bark: () => void;
}// 创建 Dog 对象
let dog: Dog = {name: "Rex",age: 5,breed: "German Shepherd",bark: function () {console.log("Woof! Woof!");},
};// 调用方法
dog.bark();

输出:

Woof! Woof!

案例 5:泛型对象

// 定义一个泛型接口
interface Pair<T, U> {first: T;second: U;
}// 创建不同类型的 Pair 对象
let numberPair: Pair<number, number> = {first: 1,second: 2,
};let stringPair: Pair<string, string> = {first: "Hello",second: "World",
};let mixedPair: Pair<string, number> = {first: "Age",second: 30,
};// 访问属性
console.log(`Number Pair: ${numberPair.first}, ${numberPair.second}`);
console.log(`String Pair: ${stringPair.first}, ${stringPair.second}`);
console.log(`Mixed Pair: ${mixedPair.first}, ${mixedPair.second}`);

输出:

Number Pair: 1, 2
String Pair: Hello, World
Mixed Pair: Age, 30

案例 6:联合类型与交叉类型

// 定义两个接口
interface Bird {wings: number;fly: () => void;
}interface Fish {fins: number;swim: () => void;
}// 使用联合类型
let pet: Bird | Fish = {wings: 2,fly: function () {console.log("Flying...");},
};// 调用方法
if ("fly" in pet) {pet.fly();
}// 使用交叉类型
let creature: Bird & Fish = {wings: 2,fins: 4,fly: function () {console.log("Flying...");},swim: function () {console.log("Swimming...");},
};// 调用方法
creature.fly();
creature.swim();

输出:

Flying...
Flying...
Swimming...

四、总结

TypeScript 提供了丰富的语法和功能来定义和管理对象。通过使用接口、类型别名、泛型等特性,开发者可以创建结构化、可维护和可重用的代码。理解这些语法知识点对于有效地使用 TypeScript 进行开发至关重要。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

应用BERT-GCN跨模态情绪分析:贸易缓和与金价波动的AI归因

本文运用AI量化分析框架&#xff0c;结合市场情绪因子、宏观经济指标及技术面信号&#xff0c;对黄金与美元指数的联动关系进行解析&#xff0c;揭示本轮贵金属回调的深层驱动因素。 周三&#xff0c;现货黄金价格单日跌幅达2.1%&#xff0c;盘中触及3167.94美元/盎司关键价位&…

命令行登录 MySQL 报 Segmentation fault 故障解决

问题描述&#xff1a;对 mysql8.0.35 源码进行 make&#xff0c;由于一开始因为yum源问题少安装依赖库 库&#xff0c;在链接时遇到错误 undefined reference to&#xff0c;后来安装了相关依赖库&#xff0c;再次 make 成功。于是将 mysqld 启动&#xff0c;再用 mysql -u roo…

Axure设计数字乡村可视化大屏:构建乡村数据全景图

今天&#xff0c;让我们一同深入了解由Axure设计的数字乡村可视化大屏&#xff0c;看看它如何通过精心的布局和多样化的图表类型&#xff0c;将乡村的各类数据以直观、易懂的方式呈现出来&#xff0c;为乡村管理者提供有力的数据支持。 原型效果预览链接&#xff1a;Axure数字乡…

3D个人简历网站 4.小岛

1.模型素材 在Sketchfab上下载狐狸岛模型&#xff0c;然后转换为素材资源asset&#xff0c;嫌麻烦直接在网盘链接下载素材&#xff0c; Fox’s islandshttps://sketchfab.com/3d-models/foxs-islands-163b68e09fcc47618450150be7785907https://gltf.pmnd.rs/ 素材夸克网盘&a…

智能开发工具PhpStorm v2025.1——增强AI辅助编码功能

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

Spark 的运行模式(--master) 和 部署方式(--deploy-mode)

Spark 的 运行模式&#xff08;--master&#xff09; 和 部署方式&#xff08;--deploy-mode&#xff09;&#xff0c;两者的核心区别在于 资源调度范围 和 Driver 进程的位置。 一、核心概念对比 维度--master&#xff08;运行模式&#xff09;--deploy-mode&#xff08;部署…

sqli—labs第八关——布尔盲注

一&#xff1a;确定注入类型 按照我们之前的步骤来 输入 ?id1 and 11-- ?id1 and 12-- 界面正常 第二行界面异常空白 所以注入类型为单引号闭合型 二&#xff1a; 布尔盲注 1.判断是否使用条件 &#xff08;1&#xff09;&#xff1a;存在注入但不会直接显示查询结果 …

ARP 原理总结

&#x1f310; 一、ARP 原理总结 ARP&#xff08;Address Resolution Protocol&#xff09;是用于通过 IP 地址解析 MAC 地址的协议&#xff0c;工作在 链路层 与 网络层之间&#xff08;OSI 模型的第三层与第二层之间&#xff09;。 &#x1f501; ARP通信过程&#xff1a; …

SpringCloud——EureKa

目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构&#xff1a;根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立项目开发&#xff0c;称为服务。 优点&#xff1a; 降…

机顶盒刷机笔记

疑难杂症解决 hitool线刷网口不通tftp超时--》关闭防火墙cm201-2卡刷所有包提示失败abort install--》找个卡刷包只刷fastboot分区再卡刷就能通过了&#xff08;cm201救砖包 (M8273版子&#xff09;&#xff09; 刷机工具 海兔烧录工具HiTool-STB-5.3.12工具&#xff0c;需要…

Linux动静态库制作与原理

什么是库 库是写好的现有的&#xff0c;成熟的&#xff0c;可以复用的代码。现实中每个程序都要依赖很多基础的底层库&#xff0c;不可能每个人的代码都从零开始&#xff0c;因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统…

如何通过小智AI制作会说话的机器人玩具?

一、硬件准备与组装 1. 核心硬件选择 主控芯片&#xff1a;选择支持无线网络连接、音频处理和可编程接口的嵌入式开发板 音频模块&#xff1a;配备拾音麦克风与小型扬声器&#xff0c;确保语音输入/输出功能 显示模块&#xff1a;选择适配的交互显示屏用于可视化反馈 扩展模…

如何控制邮件发送频率避免打扰用户

一、用户行为 监测用户与邮件的互动数据&#xff0c;如打开率、点击率下滑或退订申请增多&#xff0c;可能是发送频率过高的警示信号。利用邮件营销平台的分析工具&#xff0c;识别这些指标的变动趋势&#xff0c;为调整提供依据。 二、行业特性与受众差异 不同行业用户对邮…

定积分的“偶倍奇零”性质及其使用条件

定积分的“偶倍奇零”性质是针对对称区间上的奇偶函数积分的重要简化方法。以下是其核心内容和应用要点&#xff1a; ​一、基本性质 ​偶函数&#xff08;偶倍&#xff09;​ 若 f(x) 在 [−a,a] 上为偶函数&#xff08;即 f(−x)f(x)&#xff09;&#xff0c;则&#xff1a; …

如何在 Windows 11 或 10 上安装 Fliqlo 时钟屏保

了解如何在 Windows 11 或 10 上安装 Fliqlo,为您的 PC 或笔记本电脑屏幕添加一个翻转时钟屏保以显示时间。 Fliqlo 是一款适用于 Windows 和 macOS 平台的免费时钟屏保。它也适用于移动设备,但仅限于 iPhone 和 iPad。Fliqlo 的主要功能是在用户不活动时在 PC 或笔记本电脑…

【C/C++】C++并发编程:std::async与std::thread深度对比

文章目录 C并发编程&#xff1a;std::async与std::thread深度对比1 核心设计目的以及区别2 详细对比分析3 代码对比示例4 适用场景建议5 总结 C并发编程&#xff1a;std::async与std::thread深度对比 在 C 中&#xff0c;std::async 和 std::thread 都是用于并发编程的工具&am…

Axure疑难杂症:垂直菜单展开与收回(4大核心问题与专家级解决方案)

亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢!如有帮助请订阅专栏! Axure产品经理精品视频课已登录CSDN可点击学习https://edu.csdn.net/course/detail/40420 课程主题:垂直菜单展开与收回 主要内容:超长菜单实现、展开与收回bug解释、Axure9版本限制等问题解…

ASIC和FPGA,到底应该选择哪个?

ASIC和FPGA各有优缺点。 ASIC针对特定需求&#xff0c;具有高性能、低功耗和低成本&#xff08;在大规模量产时&#xff09;&#xff1b;但设计周期长、成本高、风险大。FPGA则适合快速原型验证和中小批量应用&#xff0c;开发周期短&#xff0c;灵活性高&#xff0c;适合初创企…

DAY 30 模块和库的导入

知识点回顾&#xff1a; 1.导入官方库的三种手段 2.导入自定义库/模块的方式 3.导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 import math # 导入…

MyBatis:动态SQL

文章目录 动态SQLif标签trim标签where标签set标签foreach标签include标签和sql标签 Mybatis动态SQL的官方文档&#xff1a; https://mybatis.net.cn/dynamic-sql.html 动态SQL 动态SQL是 MyBatis的强大特性之一,如果是使用JDBC根据不同条件拼接sql很麻烦&#xff0c;例如拼接…