TS 自学笔记(一)

本文写于 2020 年 5 月 6 日

日常废话两句

有几天没有更新了,最近学的比较乱,休息了两天感觉好一些了。这两天玩了几个设计软件,过几天也写篇文章分享分享。

为啥要学 TS?

进入正题哈,经常写 JS 的人会特别多的碰到一个 bug:xxxx is not a function之类的。

这是为什么呢?

其实就是我们用了一些不属于它的方法。

比如说我们有一个const a = 250,然后我们让他a.filter(()=>{})

有人可能会说,那明明是一个 number 类型,我怎么可能给他 filter 呢?

我之前就犯过这个错误,我想让一个数组等于另一个被 push 一个新元素数组:

let newArr = arr.push('hello');
newArr.filter(() => {});

要知道,arr.push 的返回值是新的数组长度!让一个 number 类型去使用数组方法,自然是会报错的。

好吧,我知道这样似乎非常愚蠢,但是总而言之,在日常写 JS 的报错中,有大把大把的错因都是这种完全可以避免掉的问题

如果是 Java 或是 C#,编辑器在还没运行时就给会你划上红线,不会等到你运行了再去告诉你你错了。

这就是动态语言的毛病。

所以我们需要学习 TypeScript,用它来构建应用,节省时间。据说用了 TS,能有效减少 80%的 Bug(笑)

不管这是不是真的,从各个大框架对于 TS 的青睐程度来看,未来几年内,TS 必然会是绝对的热点之一!Angular 早早的就从 Angular.js 变成了 Angular(必须使用 TS);React 对 TS 极其友好;Vue3 也开始使用 TS 重写。

毕竟,现在已经不只是:

能被 JS 改写的终将被 JS 改写

而是:

能被 TS 改写的,终将被 TS 改写

01 变量类型

JS 是弱类型语言,TS 却不是。TS 拥有这些类型:

1. undefined
2. null
3. boolean
4. number
5. string
6. object
7. array ----️JS 有的,️JS 没有的---- 8. tuple
9. enum
10. any
11. void
12. never

注:对于 JS 来说,数组就是 Object 类型,并且在 JS 中数据类型并不是小写,而是大写。

在 2020 年,JS 的数据类型增加了 BigInt 和 Symbol 两种。

number、string、boolean 没有什么特别好说的,和 JS 没什么区别,我来写几个我觉得比较重要的。

数组的声明

let list: number[] = [1, 2, 3];
let list_b: Array<number> = [1, 2, 3];

第一种方法不难理解,就是生命一个 number 数组。

第二种方法叫做数组泛型,即Array<元素类型>

什么叫做泛型呢?

如果我们有一个函数:

function identity(arg: number): number {
return arg;
}

那这个时候,传入的变量就必须是数字。

考虑到可复用性的问题,我们可以使用泛型。

function identity<T>(arg: T): T {
return arg;
}

identity 函数叫做泛型(注意,T 不是泛型!),因为它可以适用于多个类型。

T 是类型变量,它是一种特殊的变量,只用于表示类型而不是值。它可以帮助我们捕获用户传入的类型,让我们可以对这个类型加以利用。

如果我们不确定传入的参数类型,我们是完全可以通过 any 来实现的,但是 any 就会让我们丢失 T 这一信息。

enum 是成组常量的好用法!

enum Hello {
teacher: "老师好",
classmate: "同学好",
parents: "爸爸好",
girlfriend: "刘好"
}

一般情况,枚举类型会自动赋给自己常量值:

enum Hello {
teacher, // 0
classmates, // 1
parents, // 2
girlfriend // 3
}

我们也可以从中间打断这个赋值:

enum Hello {
teacher, // 0
classmates, // 1
parents = 5, // 5
girlfriend // 6
}

接下来会进行顺延。

从来没有的 Never 值

never 类型表示的是那些永不存在的值的类型,听起来就像个悖论——我如何列举一个不存在的值?

其实never 类型可以是抛出的异常,或根本就不会有返回值的函数的返回值类型。

function error(message: string): never {
throw new Error(message);
} function fail() {
return error('Something failed');
} function infiniteLoop(): never {
while (true) {}
}

总体来讲大同小异,TS 补充了一些在别的语言中有过的常见数据类型,相信这一块对于 JS 开发者来说,不会是什么难题。

唯一的难题就是习惯,可不能老是使用 any 类型!

PS: 在命名变量的时候有一个小坑,变量名不能命名为name,因为会与 DOM 中的全局 window 对象下的 name 属性出现重名。

(未完待续)

TS 自学笔记(一)的更多相关文章

  1. TS 自学笔记(二)装饰器

    TS 自学笔记(二)装饰器 本文写于 2020 年 9 月 15 日 上一篇 TS 文章已经是很久之前了.这次来讲一下 TS 的装饰器. 对于前端而言,装饰器是一个陌生的概念,但是对于 Java.C# ...

  2. JAVA自学笔记18

    JAVA自学笔记18 1.Map接口: 1)功能: 2) Map<String,String>m=new HashMap<String,String>(); //添加元素,元素 ...

  3. JAVA自学笔记17

    JAVA自学笔记17 1.Map接口 1)概述 将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值.可以存储键值对的元素 2)与Collection接口的不同: ①Map是双列的 ...

  4. JAVA自学笔记21

    JAVA自学笔记21 1.转换流 由于字节流操作中文不是非常方便,因此java提供了转换流 字符流=字节流+编码表 1)编码表 由字符及其对应的数值组成的一张表 图解: 2)String类的编码和解码 ...

  5. JAVA自学笔记23

    JAVA自学笔记23 1.多线程 1)引入: 2)进程 是正在运行的程序.是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和系统资源. 多进程: 单进程的计算机只能做一件事情,而现在 ...

  6. TypeScript 入门自学笔记 — 类型断言(二)

    码文不易,转载请带上本文链接,感谢~ https://www.cnblogs.com/echoyya/p/14558034.html 目录 码文不易,转载请带上本文链接,感谢~ https://www ...

  7. 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...

  8. 《Linux内核设计与实现》课本第三章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第三章自学笔记 进程管理 By20135203齐岳 进程 进程:处于执行期的程序.包括代码段和打开的文件.挂起的信号.内核内部数据.处理器状态一个或多个具有 ...

  9. 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳

    <Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...

随机推荐

  1. remote debug 的详细配置

    一.remote debug 的简单介绍 何为远程debug,项目写完后就需要进入到测试环节,将代码打包发布到测试环境(服务器)上.这时候测试人员测试出一个缺陷(bug).由于代码已经发布到测试环境, ...

  2. mapper.xml文件中标签没有提示的解决

    1.首先我们来看看mapper.xml的头文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTY ...

  3. vmware 磁盘清理---还原虚拟机硬盘大小

    linux host: 1.使用dd命令将客户机未使用的磁盘空间用0填满 cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill ...

  4. Tcp三次握手四次挥手个人学习

    最近想跳槽,学习了tcp中的三次握手与四次挥手,特意记录下,加深记忆 SYN 代表请求创建连接 FIN 表示请求关闭连接 ACK 代表确认接受,不管是三次握手还是四次分手,在回应的时候都会加上ACK= ...

  5. js技术之如何在JS中获取input的值

    在JavaScript中获取input元素value的值: 方法一:var variations_number = $("#input的id名").val(); 1 <!DO ...

  6. Tomcat警告之“资源添加到Web应用程序[]的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间”

    原因 缓存不够,可以将其缓存调大 解决办法: 在 /conf/context.xml 的 前添加以下内容: <Resources cachingAllowed="true" ...

  7. 8_LQR 控制器_状态空间系统Matlab/Simulink建模分析

    再线性控制器中讲到: 举例说明(线性控制器中的一个例子)博客中有说明 在matlab中:使用lqr求解K1.K2 这里希望角度(即x1)能迅速变化,所以Q矩阵中Q11为100,并没有关心角速度(dot ...

  8. C语言中的bool类型 stdbool.h

    C语言的C99标准中已经可以使用bool类型了,但有些小伙伴可能受制于编译器等原因还无法使用,我就从最新版的VS2019 中,找到了stdbool.h这个头文件的定义,其实就是一堆宏的定义,代码如下: ...

  9. PokemonGo:LBS游戏开发

    写在前面 去吧!皮卡丘!小时候拥有一台任天堂是多少熊孩子的梦想,每个夜晚被窝里透出的微弱光线,把小小的童年带入另一个世界,家门口的鸟和狗,森林里的虫和瀑布,山洞里的超音蝠,带着小小的梦,走过一个个城市 ...

  10. PAT B1071 小赌怡情

    题目描述: 常言道"小赌怡情".这是一个很简单的小游戏:首先由计算机给出第一个整数:然后玩家下注赌第二个整数将会比第一个数大还是小:玩家下注 t 个筹码后,计算机给出第二个数.若玩 ...