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 可以使用三种访问修饰符,分别是 public、private 和 protected。

  • 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
}

相关内容

热门资讯

AI做攻略、“双向奔赴”……国... 本文转自:人民网人民网记者 许维娜今年国庆假期,AI(人工智能)成了不少年轻人的“旅行搭子”。行前做...
合肥的这个“梗”, 翻篇了 社交平台的评论区,曾长期流传一句专属于合肥的黑色幽默。有人问合肥哪里好玩,本地网友半开玩笑地回复:合...
7万+旅游中高层都在的群,今天... 做旅游这行,资源卡位、渠道互通、项目落地——往往就差一个“对的机会”。我们的行业社群已聚集70,00...
一场帐篷音乐节,如何让井研从“... 帐篷音乐节现场封面新闻记者 周洪攀10月的研溪湿地,晚风里裹着柑橘的清甜与民谣的回响。夜幕降临,10...
白鹤翩翩落星愿,上海迪士尼度假... 10月9日,世界候鸟日前夕,上海迪士尼度假区星愿公园的湖风里多了一分白鹤的灵动。三座白鹤雕塑正式揭幕...
成都锦江边赏初秋枫叶飘飘 目前,成都锦江边国华街枫叶树红了。近年来,国华街附近的几条街都栽种了红枫树,是城区较集中看枫叶的点位...
GBTA:商务旅行正在复苏,但... 亚太正在成为全球商务旅行增长的重要引擎。在经历疫情后的快速反弹之后,全球商务旅行正在进入一个新的增长...
从景区焕新到节赛引流 邹城双节... 齐鲁网·闪电新闻10月9日讯 中秋、国庆“双节”假期,邹城市文化和旅游局提前谋划、周密部署,立足自身...
江山如此多娇 且看石楼今朝 金秋十月,黄河岸畔秋意盎然,丰收盛会喜迎国庆。本次石楼国庆文旅活动以“江山如此多娇,且看石楼今朝”为...
海南国庆假期接待游客475.4... 2026年国庆假期,海南接待游客475.40万人次,较2025年增长13.1%,较2024年增长15...