IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> # 【Typescript专题】之类型进阶 -> 正文阅读

[JavaScript知识库]# 【Typescript专题】之类型进阶

【Typescript专题】之类型进阶

本篇文章是《Typescript 专题》第一篇,本篇文章主要聊一聊基本类型相关的扩展,毕竟随着文章的加深,我在阅读官方文档的时候经常会见到陌生的声明和“单词”,感觉有必要跟大家分享一下,下一篇文章,我们主要聊一聊Ts的类型断言。

系列文章,收藏不走丢哦

在这里插入图片描述

一、类型别名(type)

类型别名用来给一个类型起个新名字。例如:

type isNumber = number;
const num: isNumber = 1;

上面的例子没有任何问题,当然也是一句“废话”,那么类型别名又是为什么创造的呢?来看下面的例子:

type Name = string; // 字符串
type NameResolver = () => string; // 函数
type NameOrResolver = Name | NameResolver; // 联合类型

function getName(n: NameOrResolver): Name {
  if (typeof n === "string") {
    return n;
  } else {
    return n();
  }
}

别名常用于联合类型,如:

type ID = number | string;
const id1: ID = 123;
const id2: ID = "wpsd";

二、字符串字面量类型

字符串字面量类型用来约束取值只能是某几个字符串中的一个。

type EventNames = "click" | "scroll" | "mousemove";
function handleEvent(ele: Element, event: EventNames) {
  // do something
}

handleEvent(document.getElementById("hello"), "scroll"); // 没问题
handleEvent(document.getElementById("world"), "onmouseout"); // 报错,event 不能为 'onmouseout'

上例中,我们使用 type 定了一个字符串字面量类型 EventNames,它只能取三种字符串中的一种。

在看过第一小节后,你可能会有疑问,字符串字面亮和类型别名非常相似,区别就在于一个是限制的是类型,一个限制的是具体的值。

三、元祖

相信对于大家来说(包括我)都对这个词有些陌生,我们仍然通过具体的例子来形成概念

定义一对值分别为 string 和 number 的元组:

let yuguang1: [string, number] = ["yuguang", 25];

let yuguang2!: [string, number];
yuguang2 = ["a", 1];
yuguang2[0] = "yuguang";
yuguang2[1] = 25;
console.log(yuguang2); // ['yuguang', 25]

注意 1: 当直接对元组类型的变量进行初始化或者赋值的时候,需要提供所有元组类型中指定的项。

let yuguang: [string, number];
yuguang = ["yuguang"]; // 不能将类型“[string]”分配给类型“[string, number]”。源具有 1 个元素,但目标需要 2 个

注意 2: 添加的元素需要以元组的每个类型组成的联合类型检查:

let yuguang: [string, number];
yuguang = ["yuguang", 100];
yuguang.push({});
// 类型“{}”的参数不能赋给类型“string | number”的参数。
// 不能将类型“{}”分配给类型“number”

注意 3: 元组和联合类型在校验是是相似的,但两者还是有区别的

四、枚举

枚举(Enum)类型用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。这和上一节字面量很想子

枚举使用enum关键字来定义(新关键词~)

enum Days {
  Sun,
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
}

枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射:

enum Days {
  Sun,
  Mon,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
}

console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true

console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true

如图,上面的例子会被编译为:

在这里插入图片描述

真的是从 0 开始递增吗?我们看下面的编译示例:

在这里插入图片描述

上图中,未手动赋值的枚举项会接着上一个枚举项递增。而且你会发现,Sun 和 Wed 存储的都是 7,并且没有报错~

enum Days {
  Sun = 3,
  Mon = 1,
  Tue,
  Wed,
  Thu,
  Fri,
  Sat,
}

console.log(Days["Sun"] === 3); // true
console.log(Days["Wed"] === 3); // true
console.log(Days[3] === "Sun"); // false
console.log(Days[3] === "Wed"); // true

上面的例子中,递增到 3 的时候与前面的 Sun 的取值重复了,但是 TypeScript 并没有报错,导致Days[3]的值先是"Sun",而后又被"Wed"覆盖了。编译的结果是:

var Days;
(function(Days) {
  Days[(Days["Sun"] = 3)] = "Sun";
  Days[(Days["Mon"] = 1)] = "Mon";
  Days[(Days["Tue"] = 2)] = "Tue";
  Days[(Days["Wed"] = 3)] = "Wed";
  Days[(Days["Thu"] = 4)] = "Thu";
  Days[(Days["Fri"] = 5)] = "Fri";
  Days[(Days["Sat"] = 6)] = "Sat";
})(Days || (Days = {}));

好了,有关枚举我们就了解这么多,其实官方文档上介绍枚举用了很大的篇幅,在未来我们会随着知识的深入一点点的渗透给大家(准确的说就是我还没看懂哈哈~)

在这里插入图片描述

写在最后

本篇文章是《Typescript 专题》第一篇,本篇文章主要聊一聊基本类型相关的扩展,毕竟随着文章的加深,我在阅读官方文档的时候经常会见到陌生的声明和“单词”,感觉有必要跟大家分享一下,下一篇文章,我们主要聊一聊Ts的类型断言。

系列文章传送门:

  1. 【Typescript 入门手册】之基本类型在 TypeScript 中的应用
  2. 【Typescript 入门手册】之引用类型在 TypeScript 中的应用
  3. 【Typescript 入门手册】之函数类型在 TypeScript 中的应用
  4. 本文

关于我

  • 花名:余光
  • WX:j565017805
  • 邮箱:webbj97@163.com

其他沉淀

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:06:48  更:2021-08-04 11:09:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/22 9:21:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码