typescript前三章编译器,类型系统,类型

news/2024/11/17 0:19:39/

typescript编程指南

资料参考来源 O’reilly(Typescript编程Programming Typescript)BorisCherny著 安道 译

第一章 导言

当我使用JavaScript语言时候,检查异常,往往要等到代码运行的时候,才能检查出代码问题所在,这使得我们需要花大量时间分析代码,找出问题。
而Typescript能帮助我们检查代码,指出一些问题。减少重构代码痛苦,省去一些测试时间。
这里的错误往往是类型推断相关的问题(JavaScript具有自动类型转换功能,这为我们带来了便捷,同时也带来了问题。假如我们计算的时候传入了一个错误的类型,JavaScript会自动为我们转换,而不会报错。)
这时Typescript的作用就凸显出来了。在输入代码的过程中,文本编辑器会给出错误消息,我们能在编写代码的时候,直接看到问题。

第二章 Typescript概述

接下来几章介绍Typescript语言,概述Typescript编译器(TSC)的原理,介绍开发中能用到的Typescript特性和模式。

2.1编译器

编译器原理
代码->解析成AST(AST是去掉了空白,注释和缩进的数据结构)->AST转换成字节码->运行
Typescript的特殊之处在于,他不直接编译成字节码,而是编译成JavaScript代码,然后在js解释环境中执行(浏览器,nodejs)

Typescript编译器生成AST之后,真正运行代码之前,Typescript会对代码做类型检查。

  • TS
    1. Typescript源码->Typescript AST
    2. 类型检查器 检查AST
    3. Typescript AST->JavaScript源码
  • JS
    4. JavaScript源码->javascript AST
    5. AST->字节码
    6. 运行时计算字节码
    1-3步由TSC(Typescript编译器)操作,4-6步由浏览器等运行时操作
    TSC把Typescript编译成JavaScript时,不会考虑类型,这意味着,类型对程序生成的输出没有任何影响,类型只是在检查这一步使用。这表示可以随意改动,更新和改进程序中的类型,而无需担心会破坏应用的功能。

2.2类型系统

类型系统有两种:一种是通过显示句法告诉编译器所有值的类型,另一种自动推导值的类型。

2.3代码编辑器设置

我使用vscode,非常好的支持ts
新建ts项目
使用npm安装tsc和tslint,

mkdir chapter-2
cd chapter-2
npm init
pnpm install -D typescript tslint @types/node

第三章 类型

类型:一些列值及可以对其执行的操作
例如:

  • boolean类型包含所有的布尔值,以及可以对布尔值执行的操作(例如||,&&和!)
  • number类型包含所有的数字,以及对数字可以执行的操作(±*/)以及可以在数字上调用的方法

Typescript所有类型

  • Unknown
    • Any
      • Undefined
      • Void
      • Null
      • Any
        • Number
          • Number Enum
            • Never
        • BigInt
          • Never
        • Boolean
          • Never
        • String
          • StringEnum
            • Never
        • Symbol
          • UniqueSymbol
            • Never
        • Object
          • Array
            • Tuple
              • Never
          • Function
            • Never
          • Constructor
            • Never

3.1类型术语

可赋值性,界限,约束

3.2类型浅谈

逐一介绍支持的类型

3.2.1 any

所有类型的父亲。不设置数据类型默认为any

3.2.2 unknown

不要使用any,而使用unknown,可以比较 =,||,&&,?,!

// let a:unknown = 30
// let b = a === 130
// let c = a + 10 //'a' is of type 'unknown'
// if(typeof a == "number"){
//     // unknown需要证明
//     let d = a +10 // number
// }
// console.log(c);

3.2.3 boolean

true和false

let a = true
var b = false
const c = true
let d:boolean = true
// 类型字面量
let e:true = true
let f:true = false// Type 'false' is not assignable to type 'true'.

类型字面量
仅仅表示一个值的类型

3.2.4 number

包括所有数字,整数,浮点数,正数,负数,Infinity,NaN等

3.2.5 bigInt

javascript和Ts新引入的类型,处理较大的整数,不用担心舍入误差

3.2.6 string

包含所有字符串

3.2.7 symbol

JavaScript中一个比较新的类型,表示唯一

const e = Symbol("e")
const f:unique symbol = Symbol("f")

3.2.8 对象

ts对象类型表示对象的结构
通过对象类型无法区分不同的简单对象{}和无法的对象new
这是一种设计选择,JavaScript一般采用结构化类型。
ts描述对象有好几种方式
第一种:

let a:object = {b:'x'
}
let a:object = {b:'x'
}
a.b // Property 'b' does not exist on type 'object'.

object仅比any的范围窄了一些,差不了多少。object只能表示这是一个对象(而不是null)
第二种

let a = {b:'x'
}
a.blet b:{c:number} = {c:12
}

告诉ts某个属性是可选的

let a:{b:number,c?:string,[key:number]:boolean
}

索引签名

只读属性

let isOk:{readonly firstName:string
} = {firstName:"red"
}

3.2.9 类型别名,并集,交集

type Age = number
type Person = {name:string,age:Age
}
let driver:Person = {name:"red",age:23
}

3.2.10 数组

let a = [1,2,3]
var b = ['a','b']
let c:string[] = ['a']
let d = [1,'a']
const e = [2,'b']

3.2.11 元组

元组是array的子类型

let a:[number] = [1]
let b:[string,string,number]= ['a','b',1]
let c:[string,string?][] = [["s"],["s","s"]
]
// 剩余参数
// let a:[string,...number[]] = ["ss",1,2,3]
// 只读
let a:readonly number[] = [1,23,3]
let b:readonly [number,string] = [1,"s"]

3.2.12 null,undefined,void,never

null缺少值,undefined未定义
void没有返回值
never根本不返回

3.2.13 枚举

// 不安全
// enum Language {
//     English=0,
//     Chinese=1
// }
// 相对安全
// const enum Language{
//     English,Chinese,Spanish
// }


http://www.ppmy.cn/news/977677.html

相关文章

如何避免AWS的高额账单?

前言 Serverless架构在今天已经不再是新鲜的事物。该架构具有多个特点:较低的运营和开发成本、能快速上线、自动扩展、安全性高和适合微服务等。各大云服务商也提供了各自的Severless解决方案。然而,尽管Serverless架构在某些方面表现出色,但…

《面试1v1》Kafka的架构设计是什么样子

🍅 作者简介:王哥,CSDN2022博客总榜Top100🏆、博客专家💪 🍅 技术交流:定期更新Java硬核干货,不定期送书活动 🍅 王哥多年工作总结:Java学习路线总结&#xf…

Java进阶 —— 注解与反射

前言 在了解完Java中的集合和IO流之后,荔枝继续梳理有关Java反射的知识,这个基础知识点也是在面试中可能会考到滴哦,荔枝希望自己对于整个Java知识的理论体系有一个完整的认知,所以在接下来的几篇文章中依旧梳理是比较枯燥的理论知…

Docker Compose 容器编排 + Docker--harbor私有仓库部署与管理

目录 一、Docker Compose简介 1、Docker Compose 的YAML 文件格式及编写注意事项 2、Docker compose 使用的三个步骤 3、 Docker Compose配置常用字段 4、 Docker Compose 常用命令 5、 Docker Compose 文件结构 二: Docker Compose 安装 1、Docker Compose…

mybatis_使用

第一步&#xff1a; 编写接口 第二步&#xff1a; 编写对应的mapper中的sql语句 第三步&#xff1a; 测试 CRUD <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http…

用 Node.js 手写 WebSocket 协议

目录 引言 从 http 到 websocekt 的切换 Sec-WebSocket-Key 与 Sec-WebSocket-Accept 全新的二进制协议 自己实现一个 websocket 服务器 按照协议格式解析收到的Buffer 取出opcode 取出MASK与payload长度 根据mask key读取数据 根据类型处理数据 frame 帧 数据的发…

浏览器 html通知权限已经开了,但是还不提醒

如果您已经在Chrome浏览器中开启了HTML5通知&#xff0c;但是仍然不收到提醒&#xff0c;可能有几种可能的原因。下面是一些建议的解决方法&#xff1a; 检查浏览器设置: 确保HTML5通知在Chrome浏览器中正确启用。您可以按照以下步骤检查设置&#xff1a; 在Chrome中输入 chrom…

获取Token价格行情的多种方式

文章目录 前言一、获取类型二、获取类型的区别 优势方法总结 前言 在开发Dapp项目,很多时候都想要获取行情数据,提供可视化的价格给用户观看,这个时候如何去获取价格呢,下来会有好几种获取的方式供大家学习 一、获取类型 中心化: 使用交易所API 使用聚合数据提供商API 去中…