「TypeScript系列」TypeScript 类/类继承

文章目录

  • 一、TypeScript 类
  • 二、TypeScript 类继承
  • 三、TypeScript 类-关键字
  • 四、TypeScript 类-运算符
  • 五、TypeScript 类-重写(Override)
  • 六、TypeScript 类-访问控制修饰符
    • 1. public
    • 2. private
    • 3. protected
  • 七、TypeScript 类和接口
    • 1. 类 (Classes)
    • 2. 接口 (Interfaces)
  • 八、相关链接

一、TypeScript 类

在 TypeScript 中,类(Class)是面向对象编程(OOP)的基本构建块之一。TypeScript 提供了基于类的面向对象编程的语法,这允许你定义类、属性和方法,以及实现继承、封装和多态等面向对象的概念。

下面是一个简单的 TypeScript 类的示例:

class Animal {// 属性name: string;// 构造函数constructor(name: string) {this.name = name;}// 方法eat(): void {console.log(`${this.name} is eating.`);}// 另一个方法speak(): void {// 在 Animal 类中,我们不知道如何具体“说”,所以可能只是一个占位符console.log(`${this.name} makes a noise.`);}
}// 创建一个 Animal 实例
let dog = new Animal("Buddy");// 调用方法
dog.eat(); // 输出: Buddy is eating.
dog.speak(); // 输出: Buddy makes a noise.

在上面的示例中,我们定义了一个名为 Animal 的类,它有一个 name 属性、一个构造函数和两个方法:eatspeakconstructor 方法是特殊的,它会在创建类的实例时自动调用,用于初始化类的属性。

二、TypeScript 类继承

TypeScript 中的类可以继承自另一个类,这允许你创建具有层次结构的类。在子类中,你可以添加新的属性和方法,也可以重写从父类继承的属性和方法。

class Dog extends Animal {// 继承自 Animal 的属性(包括 name)和方法(包括 eat 和 speak)// 添加 Dog 特有的属性barkVolume: number;// 覆盖父类的 speak 方法speak(): void {console.log(`${this.name} barks.`);}// Dog 特有的方法bark(): void {console.log(`${this.name} barks loudly with volume ${this.barkVolume}.`);}// 构造函数,需要调用 super() 来初始化父类的属性constructor(name: string, barkVolume: number) {super(name); // 调用父类的构造函数this.barkVolume = barkVolume;}
}// 创建一个 Dog 实例
let d = new Dog("Mitzie", 5);// 调用从 Animal 继承的方法
d.eat(); // 输出: Mitzie is eating.// 调用 Dog 类特有的方法
d.bark(); // 输出: Mitzie barks loudly with volume 5.// 调用被覆盖的 speak 方法
d.speak(); // 输出: Mitzie barks.

在上面的例子中,Dog 类继承自 Animal 类,并添加了一个新的属性 barkVolume 和两个新的方法 barkspeak(其中 speak 方法重写了父类的方法)。在 Dog 类的构造函数中,我们使用 super() 关键字来调用父类的构造函数,以初始化从父类继承的属性。

三、TypeScript 类-关键字

  1. class:用于声明一个类。
class MyClass {// ...
}
  1. constructor:用于声明类的构造函数。
class MyClass {constructor() {// 初始化代码}
}
  1. super:在子类构造函数中用于调用父类构造函数。也可以用于访问父类的成员。
class Parent {constructor() { /* ... */ }
}class Child extends Parent {constructor() {super(); // 调用父类构造函数}
}
  1. extends:用于声明一个类继承自另一个类。
class Parent { /* ... */ }class Child extends Parent { /* ... */ }
  1. implements:用于声明一个类实现了某个接口。
interface MyInterface {method(): void;
}class MyClass implements MyInterface {method() {// 实现接口方法}
}
  1. readonly:用于声明只读属性,这些属性只能在构造函数中被赋值。
class MyClass {readonly myProp: string;constructor() {this.myProp = 'hello'; // 正确}myMethod() {this.myProp = 'world'; // 错误,因为 myProp 是只读的}
}
  1. publicprivateprotected:用于指定类成员的访问修饰符。
class MyClass {public publicProp: string; // 可以在任何地方访问private privateProp: string; // 只能在类内部访问protected protectedProp: string; // 可以在类内部和子类内部访问
}

四、TypeScript 类-运算符

在 TypeScript 类中,主要的运算符是点运算符(.),用于访问对象的属性和方法。

class MyClass {myProp: string = 'hello';myMethod() {console.log(this.myProp);}
}const obj = new MyClass();
console.log(obj.myProp); // 使用点运算符访问属性
obj.myMethod(); // 使用点运算符调用方法

五、TypeScript 类-重写(Override)

在 TypeScript 中,子类可以重写父类的方法。为了明确表明一个方法是重写的,你可以使用 override 关键字(从 TypeScript 4.3 版本开始)。这样做有助于提供更强的类型检查和更好的代码可读性。

class Parent {method() {// ...}
}class Child extends Parent {override method() {// 重写父类方法}
}

如果子类中的方法没有使用 override 关键字,但实际上是重写了父类的方法,并且父类的方法在后续版本中发生了更改(例如,方法签名改变了),那么 TypeScript 编译器可能不会给出明确的错误提示,这可能会导致运行时错误。因此,使用 override 关键字是一种好的做法,可以提高代码的可维护性和健壮性。

六、TypeScript 类-访问控制修饰符

在 TypeScript 中,访问控制修饰符(Access Modifiers)用于指定类成员的可见性和可访问性。TypeScript 支持三种访问控制修饰符:publicprivateprotected

1. public

  • 默认修饰符,如果省略则默认为 public
  • 成员可以在任何地方被访问:类的内部、子类,或者类的实例。
class MyClass {public myPublicProp: string = 'Hello';public myPublicMethod() {console.log(this.myPublicProp);}
}const obj = new MyClass();
console.log(obj.myPublicProp); // 访问类实例的公共属性
obj.myPublicMethod(); // 调用类实例的公共方法

2. private

  • 成员只能在类的内部被访问。
  • 不能在类的外部(包括子类)访问。
class MyClass {private myPrivateProp: string = 'Hello';public myPublicMethod() {console.log(this.myPrivateProp); // 可以在类内部访问}
}const obj = new MyClass();
console.log(obj.myPrivateProp); // 错误:'myPrivateProp' 是私有的

3. protected

  • 成员可以在类的内部和子类中访问。
  • 不能在类的外部(不包括子类)访问。
class ParentClass {protected myProtectedProp: string = 'Hello';protected myProtectedMethod() {console.log(this.myProtectedProp);}
}class ChildClass extends ParentClass {public accessProtectedMember() {console.log(this.myProtectedProp); // 可以在子类中访问this.myProtectedMethod(); // 可以在子类中调用父类的保护方法}
}const obj = new ChildClass();
console.log(obj.myProtectedProp); // 错误:'myProtectedProp' 是受保护的

访问控制修饰符对于封装和隐藏类的内部状态特别有用,它们允许你定义哪些成员是公开的(可以被外部使用),哪些成员是私有的(只能在类内部使用),以及哪些成员是受保护的(可以在类内部和子类中使用)。这有助于创建更加模块化和可维护的代码。

七、TypeScript 类和接口

在 TypeScript 中,类和接口是两个核心概念,它们用于定义和组织代码的结构。

1. 类 (Classes)

类是一种用户定义的类型,它表示具有相同属性和方法的对象的集合。在 TypeScript 中,你可以使用类来创建对象,并通过继承来创建更复杂的对象层次结构。

以下是一个简单的 TypeScript 类的例子:

class Greeter {greeting: string;constructor(message: string) {this.greeting = message;}greet() {return "Hello, " + this.greeting;}
}let greeter = new Greeter("world");
console.log(greeter.greet()); // 输出 "Hello, world"

在这个例子中,Greeter 是一个类,它有一个 greeting 属性和一个 greet 方法。constructor 是一个特殊的方法,用于初始化新创建的对象。

2. 接口 (Interfaces)

接口定义了一个对象的结构,但不包含实现细节。接口定义了一组方法的签名(但不包括方法体),以及一个对象可以拥有的任何属性。

TypeScript 中的接口可以帮助你确保类或其他类型遵循特定的契约(contract)。如果某个类实现了某个接口,那么它必须包含该接口中定义的所有属性和方法。

以下是一个简单的 TypeScript 接口的例子:

interface Person {firstName: string;lastName: string;sayHello(): string;
}class Employee implements Person {firstName: string;lastName: string;constructor(firstName: string, lastName: string) {this.firstName = firstName;this.lastName = lastName;}sayHello(): string {return `Hello, my name is ${this.firstName} ${this.lastName}`;}
}let employee = new Employee("John", "Doe");
console.log(employee.sayHello()); // 输出 "Hello, my name is John Doe"

在这个例子中,Person 是一个接口,它定义了 firstNamelastName 属性和 sayHello 方法。Employee 类实现了 Person 接口,因此它必须包含这些属性和方法。

接口还可以用于定义对象的形状,而不必明确它是否是类。这对于描述函数参数的类型特别有用:

function greet(person: Person) {return person.sayHello();
}let user = {firstName: "Jane",lastName: "Doe",sayHello: function() {return `Hello, I'm ${this.firstName} ${this.lastName}`;}
};console.log(greet(user)); // 输出 "Hello, I'm Jane Doe"

在这个例子中,greet 函数接受一个遵循 Person 接口的对象作为参数,并调用其 sayHello 方法。虽然 user 不是一个类实例,但它遵循了 Person 接口的形状,因此可以被传递给 greet 函数。

八、相关链接

  1. TypeScript中文网
  2. TypeScript下载
  3. TypeScript文档
  4. 「TypeScript系列」TypeScript 简介及基础语法
  5. 「TypeScript系列」TypeScript 基础类型
  6. 「TypeScript系列」TypeScript 变量声明
  7. 「TypeScript系列」TypeScript 运算符
  8. 「TypeScript系列」TypeScript 条件语句
  9. 「TypeScript系列」TypeScript 循环
  10. 「TypeScript系列」TypeScript 函数
  11. 「TypeScript系列」TypeScript Number
  12. 「TypeScript系列」TypeScript String
  13. 「TypeScript系列」TypeScript Array(数组)
  14. 「TypeScript系列」TypeScript Map 对象
  15. 「TypeScript系列」TypeScript 元组
  16. 「TypeScript系列」TypeScript 联合类型/联合类型数组
  17. 「TypeScript系列」TypeScript 接口/接口继承

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

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

相关文章

Nginx 的原理解析 worker 配置及相关问题 -细节狂魔

文章目录 前言Nginx 的最基本的执行过程(master & worker)worker 是如何进行工作的 一个 master 和 多个 woker 有哪些好处1、可以使用 nginx 热部署2、节省资源 && worker 进程之间互不影响 && nginx 服务不会中断 woker 设置多少才…

【知识图谱】探索攻略:基础、构建、高级应用与相关论文方向

【知识图谱】相关文章汇总 写在最前面一、什么是知识图谱?二、相关历史文章代码实现:简单的知识图谱可视化知识图谱前身:信息抽取知识图谱应用1:社交网络分析知识图谱应用2:威胁情报挖掘知识图谱应用3:Code…

解决Selenium NameError: name ‘By’ is not defined

解决Selenium NameError: name ‘By’ is not defined 文章目录 解决Selenium NameError: name By is not defined背景错误原因解决方法1. 检查导入语句2. 修正拼写和大小写3. 验证Selenium库安装4. 重启IDE或终端5. 检查环境变量 验证总结 背景 在使用Selenium进行Web自动化测…

Python小游戏——俄罗斯方块

文章目录 项目介绍环境配置代码设计思路1.初始化和导入库:2.定义颜色和屏幕尺寸:3.定义游戏逻辑:4.游戏循环: 源代码效果图 项目介绍 俄罗斯方块游戏是一款经典的益智游戏,玩家通过旋转和移动各种形状的方块&#xff…

并行查询定位问题

http://m.blog.itpub.net/22782597/viewspace-622714/ http://m.blog.itpub.net/30126024/viewspace-2148192/ 数据库降级执行 PARALLEL_DEGREE_POLICY PARALLEL_DEGREE_POLICY PARALLEL_MIN_PERCENT PARALLEL_SERVERS_TARGET PARALLEL_MAX_PERCENT SELECT * FROM V$SES_OPT…

【NumPy】关于numpy.clip()函数,看这一篇文章就够了

🧑 博主简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向…

Gradle筑基——Gradle Maven仓库管理

基础概念: 1.POM pom:全名Project Object Model 项目对象模型,用来描述当前maven项目发布模块的基础信息 pom主要节点信息如下: 配置描述举例(com.android.tools.build:gradle:4.1.1)groupId组织 / 公司的名称com.…

初学Echart

创建一个html文件 1.引入 点击链接----快速上手网址&#xff1a;快速上手 - 使用手册 - Apache ECharts 复制这一串【这个是引入echart路径】 引入到这里 2.使用 我们在上一步---点击返回--往下翻---找到完整代码--复制黏贴 复制粘贴后--总体长这样 <!DOCTYPE html> &…

时钟源介绍

在微控制器&#xff08;特别是STM32系列微控制器&#xff09;的配置中&#xff0c;HSI、HSE和PLL是三种不同的时钟源&#xff0c;每个源都有其具体的用途和特点&#xff1a; HSI (High-Speed Internal) 定义&#xff1a;HSI代表高速内部时钟源。这是一个内置的振荡器&#xff…

在Linux服务上管理Redis的启动、重启和关闭

在Linux服务上管理Redis的启动、重启和关闭 Redis是一个高性能的开源键值对存储数据库&#xff0c;广泛用于缓存、会话管理和实时数据处理等场景。在Linux服务器上管理Redis服务是开发和运维人员需要掌握的重要技能。本文将详细介绍如何在Linux系统上启动、重启和关闭Redis服务…

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型

【大模型部署】在C# Winform中使用文生图Stable Diffusion XL 模型 前言 整了一个在C# Winform中调用文生图Stable Diffusion XL的小程序&#xff0c;基于百度智能云千帆平台 步骤 如何注册百度智能云和创建应用&#xff0c;获取API 密钥等和在之前的博客中基本相同&#…

[C++]debug介绍+debug时如何查看指针指向内存处的值

一、简介 预备工具和知识&#xff1a;使用使用VSCode使用Debug。 本文简介&#xff1a;本文将简要介绍debug中Continue&#xff0c;Step Over&#xff0c;Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址&#xff08;指针&#xff09;的值&#xff1b; 二、D…

连公司WiFi后,无法访问外网,怎么回事,如何解决?

文章目录 封面问题描述问题探究什么是DNS&#xff1f;分布式&#xff0c;层次数据库如何理解分布式&#xff1f;如何理解层次&#xff1f; 本地DNS服务器迭代查询&#xff0c;递归查询DNS缓存参考资料 封面 问题描述 从甲方项目组返回公司后&#xff0c;我习惯性连上公司WiFi&…

视频号小店去哪里找货源?最全货源渠道分享!

大家好&#xff0c;我是电商糖果 视频号小店因为是这两年电商行业新出来的黑马&#xff0c;吸引着不少商家入驻。 入驻了商家中很多都没有自己的货源渠道。 他们基本都是从无货源开始起步&#xff0c;后期通过积累资源&#xff0c;慢慢搭建属于自己的货源渠道。 可是渐渐的…

算法的时间与空间复杂度

算法是指用来操作数据、解决程序问题的一种方法。对于同一问题&#xff0c;使用不同的算法&#xff0c;也许最终结果是一样的&#xff0c;但在过程中消耗的资源和时间却会有很大的区别。 那我们该如何去衡量不同算法之间的优劣呢&#xff1f;主要还是从算法所占用的【时间】和…

5.26机器人基础-空间描述和变换-总结

非目录 方便我找 重点 逆解 位姿矩阵的几何意义 实际坐标需要除以比例因子才能得到 比例因子的好处&#xff1a;在计算机的储存更加简单方便&#xff0c;例如x,y,x原先很大时&#xff0c;等比例改变 位姿坐标的齐次变换&#xff1a;左乘齐次坐标 从端点到末端&#xff0c…

集合竞价选股策略实战测试

2.3.2版本发布的集合竞价选股策略是网友吴PSYP提供的&#xff0c;团队按照策略实现的选股算法&#xff0c;最近半个月对策略进行的实战测试&#xff0c;从集合竞价选股开始&#xff0c;到股票收盘&#xff0c;收盘价格大于集合竞价价格&#xff0c;算作盈利&#xff0c;测试结果…

Vision Mamba论文阅读(主干网络)

这几天被Mamba刷屏了&#xff0c;又由于本人是做视觉方面任务的&#xff0c;固来看看mamba在视觉上的应用。 今天分享的是Vision Mamba: Vision Mamba: Efficient Visual Representation Learning with Bidirectional State Space Model 论文网址&#xff1a;https://arxiv.or…

eNSP学习——配置OSPF的认证

目录 知识储备 主要命令 1、配置接口IP地址 2、OSPF进程号、区域号以及网段宣告 3、OSPF认证 4、查看简要的OSPF邻居信息 实验内容 实验目的 实验步骤 实验拓扑 实验编址 具体操作 1、基本配置 测试结果如下(仅提供一个作为参考) 2、搭建OSPF网络 3、配置公司…

MySQL满足条件函数里放查询最大函数的方法

1.MySQL满足条件函数里放查询最大函数的方法 在MySQL中&#xff0c;如果我们想要在一个条件函数&#xff08;如CASE&#xff09;内部使用聚合函数&#xff08;如MAX&#xff09;来获取某个字段的最大值&#xff0c;我们通常需要在外部查询或子查询中执行这个聚合操作&#xff…