typeScript 接口和类

工具: PlayGround


接口

接口用来定义对象的结构和类型,描述对象应该具有哪些属性和方法。

它仅用于声明,而不是实现; 这对于编写可重用的代码非常有用。它可用于:

关键字是interface, 注意:它只是作为TypeScript的一部分,并不会转换为JavaScript

  • 数组定义
interface data {[index:number]: number,
}// 类型一致,没有问题
let numList_1: data = [1, 2, 3];
// Type 'string' is not assignable to type 'number'
let numList_2: data = [1, "", 3];
  • 对象的定义
// 方式1
interface Data_1 {name: string,age: number,
}
let data_1: Data_1 = {name: "hello",age: 20,
}
console.log(data_1);// 方式2
interface Data_2 {name: string;age: number;// 可选属性, 表示可以选择不赋值sex?: number;// 只读属性,表示一旦赋值后不可修改                       readonly id:number | string;   
}
let data_2: Data_2 = {name: "hello",age: 20,id : "0001",
}
data_2.age = 10;
// Error: Cannot assign to 'id' because it is a read-only property
data_2.id = 10;
  • 作为类实现
interface Person {name: string;age: number;greet: () => void;
}// 通过implements实现接口
class Student implements Person {name: string;age: number;constructor(name: string, age: number) {this.name = name;this.age = age;}greet() {console.log(`Hello, my name is ${this.name}`);}
}let student = new Student("ok", 20);
student.greet();        // "Hello, my name is ok" 

typeScript中类的使用,主要通过class来创建类对象,通过new来实例化类对象, 支持特性:

  • instanceof检测对象类型

  • 访问权限publicprotectedprivate

  • 函数重载

  • 继承或重写

  • 静态成员和方法

基本的使用:

class Demo {private _name: string = "";private _age: number = 0;// 构造函数constructor(name:string) {this._name = name;} public log() {console.log(`Demo 的名字为${this._name}`);}
}
let demo = new Demo("demo");
console.log(typeof(demo));              // "object" 
console.log(demo instanceof Demo);      // true    

函数重载

类的函数重载的编写方式,不要直接实现:

class Demo {private _name: string = "";private _age: number = 0;// 构造函数constructor(name:string) {//} // Error: Multiple constructor implementations are not allowed// 原因在于如果实现,编译器创建对象不知道调用哪个构造函数constructor(name: string, age:number) {//}
}

可以通过采用声明和可选参数的方式来实现:

// 实例1
class Demo {private _name: string = "";private _age: number = 0;// 构造函数constructor(name:string);constructor(name: string, age:number);constructor(name: string, age?:number) {this._name = name;if (age) {this._age = age;}}
}// 实例2:
class Calculator {add(a: number, b: number): number;add(a: string, b: string): string;add(a: any, b: any): any {if (typeof a === 'number' && typeof b === 'number') {return a + b;} else if (typeof a === 'string' && typeof b === 'string') {return a.concat(b);} else {throw new Error('Invalid arguments');}}
}const calculator = new Calculator();console.log(calculator.add(1, 2));      // 3
console.log(calculator.add('Hello', ' World')); // Hello World

继承和重写

继承的话,使用extends, 如果对基类中的方法重新编写,就是重写

// 定义接口,简单的实例可以忽略;增加的话,有助于理解代码和重写代码相关
interface Animal {sound(): void;
}// 实现接口
class Cat implements Animal {private _breed: string;private _name: string = "Cat";constructor(breed: string) {this._breed = breed;}// 通过get和set的方式设置对象变量属性get Name():string {return this._name;}set Name(name: string) {this._name = name;}sound(): void {console.log("猫");}
}// 继承
class DomesticCat extends Cat {public log() {console.log("this is DomesticCat");}
}// 重写
class WildCat extends DomesticCat {sound(): void {console.log("野猫叫声");}
}const domesticCat = new DomesticCat("domesticCat");
domesticCat.Name = "短毛猫"
console.log(`cat Name: ${domesticCat.Name}`);   //"cat Name: 短毛猫" 
domesticCat.sound(); // 猫// 
const wildCat = new WildCat("豹猫");
wildCat.sound();    // 野猫叫声

注意:

  • 如果未声明访问权限publicprotectedprivate,则默认为public
  • 对于变量,建议开头增加下划线_ 表示私有
  • 可以多继承,只需要在extends后面添加类接口即可
  • 注意区分implementsextends,前者主要用于对interface声明的方法等进行实现, 而后者主要应用于已经实现后的方法进行继承或重写。

Static

静态变量或方法在类中声明后,可以不通过new对象直接赋值或使用,但赋值后不可在改变。

class Demo {static value: number;static getValue() {console.log(`static value: ${Demo.value}`);}
}
Demo.value = 10;
Demo.getValue();        //"static value: 10" 

它常用于编写单例模式,注意: 构造函数设置为私有,以保证对象的唯一性

class Singleton {private static instance: Singleton;private constructor() {// 私有化构造函数,防止外部实例化}public static getInstance(): Singleton {if (!Singleton.instance) {Singleton.instance = new Singleton();}return Singleton.instance;}public greet(): void {console.log("Hello");}
}// 创建单例实例
const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();console.log(instance1 === instance2); // trueinstance1.greet(); // "Hello" 
instance2.greet(); // "Hello" 

const

作为常量使用,在类中使用注意:

  • 只能用于修改基本数据类型和对象属性字面量,不可用于修饰引用类型
  • 如果声明const 一定要记得初始化,不能在构造函数或其他函数进行初始化
  • 声明以后,其本质就是readonly 只读属性
class MyClass {readonly PI: number = 3.14;readonly config: { name: string, age: number } = { name: "John", age: 25 };constructor() {// this.PI = 3.14159;  // 错误,无法对只读属性进行重新赋值// this.config = { name: "Alice", age: 30 }; // 错误,无法对只读属性进行重新赋值this.config.name = "Alice"; // 正确,可以修改对象字面量属性的值this.config.age = 30; // 正确,可以修改对象字面量属性的值}printInfo(): void {console.log(`PI: ${this.PI}`);console.log(`Name: ${this.config.name}, Age: ${this.config.age}`);}
}const myObj = new MyClass();
myObj.printInfo();// "PI: 3.14" 
// "Name: Alice, Age: 30" 

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

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

相关文章

OSPF在广播类型的网络拓扑中DR和BDR的选举

指定路由器(DR): 一个网段上的其他路由器都和指定路由器(DR)构成邻接关系,而不是它们互相之间构成邻接关系。 备份指定路由器(BDR): 当DR出现问题,由BDR接…

redis事务对比Lua脚本区别是什么

redis官方对于lua脚本的解释:Redis使用同一个Lua解释器来执行所有命令,同时,Redis保证以一种原子性的方式来执行脚本:当lua脚本在执行的时候,不会有其他脚本和命令同时执行,这种语义类似于 MULTI/EXEC。从别…

中间件: Kafka安装部署

单机部署 下载二进制包 cd /opt/soft/archive wget http://archive.apache.org/dist/kafka/3.2.0/kafka_2.12-3.2.0.tgz tar -zxf kafka_2.12-3.2.0.tgz -C ../ cd ../kafka_2.12-3.2.0修改配置 vim config/server.propertiesadvertised.listenersPLAINTEXT://39.105.11.50:…

C++系列-函数重载

C系列-函数重载 函数重载函数重载的条件函数重载注意事项引用作为重载函数重载遇到默认参数 函数重载 函数名可以相同, 提高复用性 函数重载的条件 同一个作用域下函数名相同函数参数不同 – 参数个数不同 – 参数顺序不同 – 参数类型不同不可以使用返回值作为重…

UI和API自动化测试的失败原因

一、UI自动化失败原因: 界面发生了变化,但是脚本没有更新脚本中的等待时间太短了,导致元素还没出来就被判定为失败了网络因素,网络如果太慢的话,界面元素的显示就会滞后执行的时候突然弹出一个窗口影响了元素的定位Ag…

Python web实战之Django 的跨站点请求伪造(CSRF)保护详解

关键词:Python、Web、Django、跨站请求伪造、CSRF 大家好,今天我将分享web关于安全的话题:Django 的跨站点请求伪造(CSRF)保护,介绍 CSRF 的概念、原理和保护方法. 1. CSRF 是什么? CSRF&#…

微服务与Nacos概述-6

RBAC 模型 RBAC 基于角色的访问控制是实施面向企业安全策略的一种有效的访问控制方式。 基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当…

【MySQL】MySQL基础知识详解(一)

MySQL select列的别名去除重复行空值参与运算着重号查询常数显示表结构过滤数据 排序使用 ORDER BY 对查询到的数据进行排序操作。使用列的别名,进行排序二级排序 分页LIMIT 分页显示公式:(当前页数减一)*每页条数,每页…

【AIGC】 快速体验Stable Diffusion

快速体验Stable Diffusion 引言一、安装二、简单使用2.1 一句话文生图2.2 详细文生图 三、进阶使用 引言 stable Diffusion是一款高性能的AI绘画生成工具,相比之前的AI绘画工具,它生成的图像质量更高、运行速度更快,是AI图像生成领域的里程碑…

【100天精通python】Day41:python网络爬虫开发_爬虫基础入门

目录 专栏导读 1网络爬虫概述 1.1 工作原理 1.2 应用场景 1.3 爬虫策略 1.4 爬虫的挑战 2 网络爬虫开发 2.1 通用的网络爬虫基本流程 2.2 网络爬虫的常用技术 2.3 网络爬虫常用的第三方库 3 简单爬虫示例 专栏导读 专栏订阅地址:https://blog.csdn.net/…

【玩转Linux操作】crond的基本操作

🎊专栏【玩转Linux操作】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【Counting Stars 】 欢迎并且感谢大家指出小吉的问题🥰 文章目录 🍔概述🍔命令⭐常用选项 🍔练…

软件-常用软件系统架构

目录 1.客户端-服务器架构 2.分布式架构 3.微服务架构 4.事件驱动架构 5.单体架构 6.混合架构 当我们谈论系统架构时,可以将其比喻为一座房子的设计和结构,想象一下你计划建造一座豪华别墅,你需要考虑各种因素:如房子的大小…

linux下常见编译问题

linux下常见编译问题 linux-cmake静态编译查看系统支持的的libc版本查看程序需要的动态链接库查看程序需要的libc版本freebsd下 linux-cmake静态编译 CMakeLists.txt 添加 set(CMAKE_EXE_LINKER_FLAGS "-static")ELF 64-bit LSB executable, AMD x86-64, version 1…

【微服务】一文了解 Nacos

一文了解 Nacos Nacos 在阿里巴巴起源于 2008 2008 2008 年五彩石项目(完成微服务拆分和业务中台建设),成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。 随着云计算兴起, 2018 2018 20…

编程练习(3)

一.选择题 第一题: 函数传参的两个变量都是传的地址,而数组名c本身就是地址,int型变量b需要使用&符号,因此答案为A 第二题: 本题考察const修饰指针变量,答案为A,B,C,D 第三题: 注意int 型变…

13---内嵌HTML和React

虽然Markdown本身不支持内嵌HTML和React&#xff0c;但可以在Markdown文档中直接插入HTML代码和React组件。 一、在markdown中内嵌HTML 在Markdown中&#xff0c;你可以使用HTML标签来实现更复杂的样式和布局。例如&#xff0c;你可以使用<div>标签来创建一个容器&#…

算法与数据结构(五)--树与二叉查找树

符号表的增删查操作&#xff0c;随着元素个数N的增多&#xff0c;其耗时也是线性增多的&#xff0c;时间复杂度都是O(n)&#xff0c;为了提高运算效率&#xff0c;我们学习树这种数据结构。 目录 一.树的基本定义 二.树的相关术语 三.二叉树的基本定义 四.二叉树的链表实现…

Thinkphp定义位置常量

ThinkPHP 是一个流行的 PHP 开发框架&#xff0c;它提供了丰富的功能和便捷的开发方式。在 ThinkPHP 中&#xff0c;我们可以使用常量来定义一些通用的配置信息或路径&#xff0c;以便于代码的维护和管理。在本文中&#xff0c;我们将探讨 ThinkPHP 中定义位置常量的作用和用法…

leetcode 279. 完全平方数

2023.8.18 与零钱兑换相似&#xff0c;本题属于完全背包问题&#xff1a;完全平方数为物品&#xff0c;整数n为背包。 直接上代码&#xff1a; class Solution { public:int numSquares(int n) {vector<int> dp(n1 , INT_MAX);dp[0] 0;for(int i1; i*i<n; i){for(in…

时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测

时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | MATLAB实现WOA-CNN-BiGRU鲸鱼算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 时序预测 | MATLAB实现WOA-CNN-BiGRU鲸…