TS 入门(五):TypeScript接口与类

目录

  • 前言
  • 回顾高级类型与类型操作
  • 1. 接口
    • a. 基本接口
    • b. 可选属性和只读属性
    • c. 函数类型接口
    • d. 可索引类型
    • e. 接口继承
  • 2. 类
    • a. 基本类
    • b. 类的成员(属性和方法)
    • c. 构造函数
    • d. 继承和派生类
    • e. 公有、私有和受保护的修饰符
    • f. 静态属性和方法
    • g. 抽象类
  • 扩展知识点:接口与类的结合使用
  • 结语

前言

在前三章中,我们介绍了 TypeScript 的基础知识、函数与对象类型。在本章中,我们将探讨更高级的类型和类型操作,包括联合类型、交叉类型、字面量类型、类型断言、类型兼容性和类型守卫等内容。通过这些高级特性,你将能够编写出更加灵活和强大的代码。

  • TS 入门(一):TypeScript 简介与安装
  • TS 入门(二):Typescript类型与类型注解
  • TS 入门(三):Typescript函数与对象类型
  • TS 入门(四):TypeScript 高级类型与类型操作

回顾高级类型与类型操作

在上一章中,我们学习了以下内容:

  • 联合类型和交叉类型
  • 字面量类型
  • 类型断言
  • 类型兼容性
  • 类型守卫(typeof, instanceof, 自定义类型守卫)
  • 类型映射

在这里插入图片描述

正文开始如果觉得文章对您有帮助,请帮我三连+订阅,谢谢💖💖💖


1. 接口

a. 基本接口

接口用于定义对象的结构,包括属性和方法。

interface Person {
  name: string;
  age: number;
}

let user: Person = {
  name: "张三",
  age: 25,
};

b. 可选属性和只读属性

在接口中,可以将某些属性定义为可选或只读。

interface Product {
  name: string;
  price: number;
  description?: string; // 可选属性
  readonly id: number; // 只读属性
}

let product: Product = {
  name: "手机",
  price: 4999,
  id: 1,
};

// product.id = 2; // 错误,id 是只读属性

c. 函数类型接口

接口不仅可以用于对象,还可以用于函数类型。

interface SearchFunc {
  (source: string, subString: string): boolean;
}

let mySearch: SearchFunc = function (source: string, subString: string): boolean {
  return source.indexOf(subString) !== -1;
};

d. 可索引类型

可索引类型用于表示对象的索引和对应的值类型。

interface StringArray {
  [index: number]: string;
}

let myArray: StringArray = ["Hello", "World"];
let myStr: string = myArray[0]; // "Hello"

e. 接口继承

接口可以继承其他接口,从而扩展它们的属性和方法。

interface Shape {
  color: string;
}

interface Square extends Shape {
  sideLength: number;
}

let square: Square = {
  color: "蓝色",
  sideLength: 10,
};

2. 类

a. 基本类

类用于创建对象,并定义对象的属性和方法。

class Animal {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  move(distance: number = 0) {
    console.log(`${this.name} 移动了 ${distance}`);
  }
}

let dog = new Animal("狗");
dog.move(10); // "狗 移动了 10 米"

b. 类的成员(属性和方法)

类可以包含属性和方法,方法可以使用 this 访问类的属性。

class Person {
  name: string;
  age: number;

  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }

  greet() {
    console.log(`你好,我是 ${this.name},今年 ${this.age}`);
  }
}

let person = new Person("李四", 30);
person.greet(); // "你好,我是 李四,今年 30 岁"

c. 构造函数

构造函数用于创建类的实例,并初始化属性。

class Car {
  brand: string;
  model: string;

  constructor(brand: string, model: string) {
    this.brand = brand;
    this.model = model;
  }

  display() {
    console.log(`这是一辆 ${this.brand} ${this.model}`);
  }
}

let car = new Car("特斯拉", "Model S");
car.display(); // "这是一辆 特斯拉 Model S"

d. 继承和派生类

类可以继承其他类,从而扩展和重用它们的属性和方法。

class Dog extends Animal {
  bark() {
    console.log("汪汪");
  }
}

let myDog = new Dog("旺财");
myDog.bark(); // "汪汪"
myDog.move(5); // "旺财 移动了 5 米"

e. 公有、私有和受保护的修饰符

可以使用 publicprivateprotected 修饰符来控制类成员的访问权限。

class Person {
  public name: string;
  private age: number;
  protected address: string;

  constructor(name: string, age: number, address: string) {
    this.name = name;
    this.age = age;
    this.address = address;
  }

  public getAge() {
    return this.age;
  }
}

class Employee extends Person {
  constructor(name: string, age: number, address: string) {
    super(name, age, address);
  }

  public getAddress() {
    return this.address; // 正确,protected 属性在派生类中可访问
  }
}

let emp = new Employee("李四", 30, "北京");
console.log(emp.name); // "李四"
// console.log(emp.age); // 错误,age 是私有属性
// console.log(emp.address); // 错误,address 是受保护属性

f. 静态属性和方法

静态属性和方法是属于类本身的,而不是类的实例。

class MathUtil {
  static PI = 3.14;

  static circleArea(radius: number): number {
    return this.PI * radius * radius;
  }
}

console.log(MathUtil.PI); // 3.14
console.log(MathUtil.circleArea(5)); // 78.5

g. 抽象类

抽象类是不能被实例化的类,用于定义子类必须实现的方法。

abstract class Animal {
  abstract makeSound(): void;

  move(): void {
    console.log("移动");
  }
}

class Dog extends Animal {
  makeSound() {
    console.log("汪汪");
  }
}

let dog = new Dog();
dog.makeSound(); // "汪汪"
dog.move(); // "移动"

扩展知识点:接口与类的结合使用

接口可以用来描述类的公共部分,并可以对类进行类型检查。

interface ClockInterface {
  currentTime: Date;
  setTime(d: Date): void;
}

class Clock implements ClockInterface {
  currentTime: Date;

  constructor(h: number, m: number) {
    this.currentTime = new Date();
  }

  setTime(d: Date) {
    this.currentTime = d;
  }
}

let clock = new Clock(12, 30);
clock.setTime(new Date());
console.log(clock.currentTime);

结语

通过本章的学习,你应该对 TypeScript 中的接口和类有了更深入的理解。掌握这些面向对象的特性将使你能够编写更加结构化和可维护的代码。在下一章中,我们将继续探讨 TypeScript 中的泛型编程,包括泛型函数、泛型接口、泛型类和泛型约束等内容。务必掌握好每个概念,它们将为你后续学习 TypeScript 提供坚实的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

算法篇 滑动窗口 leetcode 长度最小的子数组

长度最小的子数组 1. 题目描述2. 算法图分析2.1 暴力图解2.2 滑动窗口图解 3. 代码演示 1. 题目描述 2. 算法图分析 2.1 暴力图解 2.2 滑动窗口图解 3. 代码演示

React基础学习-Day04

React基础学习-Day04 常见的钩子函数及基础使用方式 1.useState useState 是 React 的一个 Hook,用于在函数组件中添加状态。它返回一个状态变量和一个更新该状态的函数。与类组件的 this.state 和 this.setState 相对应,useState 让函数组件也能拥有…

借助 Aspose.Words,在 C# 中将 Word 转换为 JPG

有时我们需要将 Word 文档转换为图片,因为 DOC 或 DOCX 文件在不同设备上的显示可能会有所不同,但图像(例如 JPG 格式)在任何地方看起来都一样。 Aspose.Words 是一种高级Word文档处理API,用于执行各种文档管理和操作…

设计模式-UML类图

1.UML概述 UML-统一建模语言,用来设计软件的可视化建模语言; 1.1 UML分类 静态结构图:类图、对象图、组件图、部署图动态行为图:状态图、活动图、时序图、协作图、构件图等 类图:反应类与类结构之间的关系&#xff0…

非法闯入智能监测摄像机:安全守护的新利器

在当今社会,安全问题愈发受到重视。随着科技的进步,非法闯入智能监测摄像机应运而生,成为保护家庭和财产安全的重要工具。这种摄像机不仅具备监控功能,还集成了智能识别和报警系统,能够在第一时间内检测到潜在的入侵行…

【三维AIGC】扩散模型LDM辅助3D Gaussian重建三维场景

标题:《Sampling 3D Gaussian Scenes in Seconds with Latent Diffusion Models》 来源:Glasgow大学;爱丁堡大学 连接:https://arxiv.org/abs/2406.13099 提示:写完文章后,目录可以自动生成,如何…

Vue3 组件向下通信 祖孙组件的通信 provide与inject

介绍 当父子间通信可以使用props,祖孙使用provide(传递)或inject(接收), 这时不管组件套的多深都可以向下传递。 例子 现在有一个需求,把App.vue的数据传递到MusciPlay.vue里。 App.vue …

Latte: Latent Diffusion Transformer for Video Generation

文章目录 AbstractIntroductionMethodology潜在扩散模型的初步研究Latte的模型变体Latte的实验验证潜在视频片段的patch embeddingTimestep-class information injectionTemporal positional embedding通过学习策略增强视频生成 Experiments Abstract Latte首先从输入的视频提…

150个pb网站模板(都是成品网站,上传php空间即可使用),建站必备

一网友提供的150个pb网站模板,其实就是成品网站,上传php空间即可使用,属于建站公司或者建站开发人员必备的资源。 一共150个基于pb的成品网站,基本上都可以找到适应你手头客户需要的一款,简单修改一下即可交活收钱了。…

python实例练习00001:打开文件输出文件内容

try:file input(enter the file :)with open(file, r) as f:data f.read()print(data) except FileNotFoundError:print(fthe file {file} does not exists:) 打开windows的cmd运行程序,效果如下:

晏子春秋-读书笔记四

景公游于寿春,坐于路寝。公曰:“嗟乎!使我有此国,吾将如之何?”晏子对曰:“此国非君之有也,乃先君之有也。君若欲有之,则修先君之德,以顺民心;若不欲有之&…

使用Jmeter进行接口自动化测试

Jmeter接口自动化 1.接口文档分析接口四要素2.自动化2.1使用用户常量来维护自动化用例2.2使用CSV文件存储常量2.3结果断言法2.4 Json提取器 接口自动化测试的意义也相当于是自动化 测试的意义 减少人为错误:自动化测试可以减少人为因素带来的错误,确保测…

RK3399基础部分

1.RK3399介绍 基础特性: 高达1.8GHz的双核Cortex-A72 四核Cortex-A53高达1.4GHz NPU高达3.0TOPS Mali-T860MP4 GPU 双通道DDR3/DDR3L/LPDDR3/LPDDR4 4K超高清H265/H264/VP9 HDR10/HLG H264编码器 双MIPI CSI和ISP USB Type-CGPU: 图形处理器(英语&…

智汇云舟智慧粮仓解决方案有哪些应用场景和价值?

“粮食”作为人类生活的生命之源,在人们的日常生活中起着决定性的作用。智慧粮仓是运用数字孪生、物联网、商业智能、云计算等技术,精确采集粮食存储过程中的所有信息,并整合到一个统一的信息管理平台上,同时粮库信息管理平台对所…

jmeter持续学习之---控制器

IF控制器 下面这种写法jmeter不推荐有性能的问题 jmeter推荐勾选上的这种写法 使用"Interpret Condition as Variable Expression"工具的性能要好一些 循环控制器 ForEach控制器 与用户定义的变量或者正则表达式提取器配合使用,循环读取。用户定义的变量或者正则…

状态管理的艺术:探索Flutter的Provider库

状态管理的艺术:探索Flutter的Provider库 前言 上一篇文章中,我们详细介绍了 Flutter 应用中的状态管理,以及 StatefulWidget 和 setState 的使用。 本篇我们继续介绍另一个实现状态管理的方式:Provider。 Provider优缺点 基…

VGMShield:揭秘视频生成模型滥用的检测与追踪技术

人工智能咨询培训老师叶梓 转载标明出处 视频生成模型,如 Stable Video Diffusion 和 Videocrafter,已经能够生成合理且高分辨率的视频。但这些技术进步也带来了被恶意利用的风险,比如用于制造假新闻或进行政治宣传。因此,来自弗…

【顺序表】算法题 --- 力扣

一、移除元素 移除元素 这个题让我们移除数组nums中值为val的元素,最后返回k(不是val的元素个数) 这样显然我们就不能再创建一个数组来解决这个问题了,只能另辟蹊径 思路:双指针 这里定义两个指针(l1&…

solidity基础语法(以太坊solidity合约)

solidity基础语法(以太坊solidity合约) 1-值类型和取值范围2-引用类型3-引用类型高阶4-固定数组和动态数组 1-值类型和取值范围 https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#subcurrency https://learnblockchain…

长按加速- 解决react - setInterval下无法更新问题

最开始直接setInterval里,useState硬写,发现更新不,固定值 换let,发现dom更新不了 正确做法是用ref 并且pc端可以长按的,只是要用onTouchStart,不要用onMouseDown onTouchStart{handleMouseDown} onTou…