typescript(元组、枚举、类、泛型)
迪丽瓦拉
2025-05-31 07:38:48
0

元组

数组合并了相同类型的对象,而元组(Tuple)合并了不同类型的对象

// 数组
let arr:number[] = [1,2]
// 元组
let arr1:[string,number]=['1',2]
// 但是使用联合类型/类型别名 同样可以实现元组的效果 
// 区别是元组对每一项进行类型约束 而下面实现的只要满足类型就可以
type name = string | number
// 进行类型使用
let arr2: name[] = ['1','2', 1]

对元组增加新的元素时,它的类型会被限制为元组中每个类型的联合类型

let tom: [string, number]
tom = ['str', 20]
tom.push('str1')
tom.push(11)
// tom.push(true)
// Argument of type 'true' is not assignable to parameter of type 'string | number'.

枚举

枚举用了C#的思想,常常用于取值被限定在一定范围内的场景,比如:颜色(红绿蓝),方向(上下左右),时间(年月日),旋转角度(0,90,180)。

使用关键字enum 来进行定义

enum Direction {Up,Down,Left,Right,
}
// 编译js之后
var Direction;
(function (Direction) {Direction[Direction["Up"] = 0] = "Up";Direction[Direction["Down"] = 1] = "Down";Direction[Direction["Left"] = 2] = "Left";Direction[Direction["Right"] = 3] = "Right";
})(Direction || (Direction = {}));

编译之后的代码这样,我们可以这样调用,没有手动赋值是从0开始递增的

console.log(Direction["Up"] === 0); // true
console.log(Direction[0] === "Up"); // true

可以对枚举项进行手动赋值,未手动赋值的枚举项会接着上一个枚举项递增

enum Direction {Up=2, Down,Left,Right}
console.log(Direction["Up"] === 2) // true
console.log(Direction["Down"] === 3) // true
console.log(Direction["Left"] === 4) // true

未手动赋值的枚举项会接着上一个枚举项递增,就会出现下面这种情况

enum Direction {Up=2, Down=1,Left,Right}
console.log(Direction["Up"] === 2); // true
console.log(Direction["Left"] === 2); // true
console.log(Direction[2] === "Up"); // false
console.log(Direction[2] === "Left"); // true
// 所以使用的时候需要注意,最好不要出现这种覆盖的情况
// 导致这一原因 是编译的时候 后面的值会将前面的覆盖

使用 const enum 定义的枚举类型为常数枚举

const enum Directions {Up,Down,Left,Right
}let directions = [Directions.Up, Directions.Down, Directions.Left, Directions.Right]

编译后的结果

var directions = [0 /* Up */, 1 /* Down */, 2 /* Left */, 3 /* Right */];

正常项目使用的时候,模块化(在声明的d.ts文件导出使用),在项目文件中直接定义使用

// 推荐第一种模块化
// xxx.d.ts
// 以方向问例,正常根据自己需要定义
// 导出
export enum Directions {Up,Down,Left,Right
}
// xxx.vue
// 引入
import { Directions } from 'xxx.d.ts'
// 使用
Directions.Up
Down.Down

TypeScript 中类的用法

TypeScript 可以使用三种访问修饰符,分别是 publicprivateprotected

  • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public

  • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问

  • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

示例:

public

class Obj {public namepublic constructor(name) {this.name = name}
}
let a = new Obj('zyk')
console.log(a.name) // zyk
// public修饰的属性可以进行更改
a.name = 'ly'
console.log(a.name) // ly

private

class Obj {private namepublic constructor(name) {this.name = name}
}
let a = new Obj('zyk')
console.log(a.name) // zyk
// private修饰的属性不可以进行更改,会报错
a.name = 'ly'// private 修饰的属性或方法,在子类中也是不允许访问的,下面会报错
class Cat extends Obj {constructor(name) {super(name)console.log(this.name)}
}

protected

class Obj {protected namepublic constructor(name) {this.name = name}
}// protected修饰的属性或方法,允许在子类中访问
class Cat extends Obj {constructor(name) {super(name)console.log(this.name)}
}

类的类型

给类加上 TypeScript 的类型很简单,与接口类似:

class Media {name: string;constructor(name: string) {this.name = name;}sayHi(): string {return `My name is ${this.name}`;}
}let a: Media = new Media('zyk');
console.log(a.sayHi()); // My name is zyk

泛型

书写一个函数这个函数会返回任何传入它的值

不适用泛型我们定义函数是

function callBack(a: any): any {return a
}

使用any能解决这个,但是我们就失去了传入的类型和传出的类型应该是一致的。比如:传入了字符串,我们只知道任何类型的值都能返回

因此,我们需要一种方法使返回值的类型与传入参数的类型是相同的。

我们使用了类型变量T,它是一种特殊的变量,只用于表示类型而不是值

function callBack(a: T): T {return a
}

添加了类型变量T,我们就可以使用这个类型捕获传入的类型,之后再次使用T当做返回值类型。我们把这个函数称之为泛型

定义泛型函数后,有两种使用方法

 // 第一种是,传入所有的参数,包含类型参数:let output = callBack("myString")// 第二种方法更普遍,利用类型推论,推导出T的类型let output = callBack("myString")

使用泛型变量

如果我们想打印入参的某一个属性(length)

function callBack(a: T): T {console.log(a.length);  // Error: T doesn't have .lengthreturn a
}
// 引入传入的T为any类型,但是对于一些类型number是没有length属性,这会出现错误

这个时候可以通过操作T类型的数组而不直接操作T,对于每一类型的数组有两种定义:类型[]、Array<类型>

我们就可以这样书写

function callBack (a:Array):Array {console.log(a.length)return a
}
function callBack (a:T[]):T[] {console.log(a.length)return a
}

相关内容

热门资讯

linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
C++ 机房预约系统(六):学... 8、 学生模块 8.1 学生子菜单、登录和注销 实现步骤: 在Student.cpp的...
A.机器学习入门算法(三):基... 机器学习算法(三):K近邻(k-nearest neigh...
数字温湿度传感器DHT11模块... 模块实例https://blog.csdn.net/qq_38393591/article/deta...
有限元三角形单元的等效节点力 文章目录前言一、重新复习一下有限元三角形单元的理论1、三角形单元的形函数(Nÿ...
Redis 所有支持的数据结构... Redis 是一种开源的基于键值对存储的 NoSQL 数据库,支持多种数据结构。以下是...
win下pytorch安装—c... 安装目录一、cuda安装1.1、cuda版本选择1.2、下载安装二、cudnn安装三、pytorch...
MySQL基础-多表查询 文章目录MySQL基础-多表查询一、案例及引入1、基础概念2、笛卡尔积的理解二、多表查询的分类1、等...
keil调试专题篇 调试的前提是需要连接调试器比如STLINK。 然后点击菜单或者快捷图标均可进入调试模式。 如果前面...
MATLAB | 全网最详细网... 一篇超超超长,超超超全面网络图绘制教程,本篇基本能讲清楚所有绘制要点&#...
IHome主页 - 让你的浏览... 随着互联网的发展,人们越来越离不开浏览器了。每天上班、学习、娱乐,浏览器...
TCP 协议 一、TCP 协议概念 TCP即传输控制协议(Transmission Control ...
营业执照的经营范围有哪些 营业执照的经营范围有哪些 经营范围是指企业可以从事的生产经营与服务项目,是进行公司注册...
C++ 可变体(variant... 一、可变体(variant) 基础用法 Union的问题: 无法知道当前使用的类型是什...
血压计语音芯片,电子医疗设备声... 语音电子血压计是带有语音提示功能的电子血压计,测量前至测量结果全程语音播报࿰...
MySQL OCP888题解0... 文章目录1、原题1.1、英文原题1.2、答案2、题目解析2.1、题干解析2.2、选项解析3、知识点3...
【2023-Pytorch-检... (肆十二想说的一些话)Yolo这个系列我们已经更新了大概一年的时间,现在基本的流程也走走通了,包含数...
实战项目:保险行业用户分类 这里写目录标题1、项目介绍1.1 行业背景1.2 数据介绍2、代码实现导入数据探索数据处理列标签名异...
记录--我在前端干工地(thr... 这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前段时间接触了Th...
43 openEuler搭建A... 文章目录43 openEuler搭建Apache服务器-配置文件说明和管理模块43.1 配置文件说明...