TS相干

基本概念

类型注解:ts里的类型注解是一种轻量级的为函数或变量增加束缚的形式

根底类型

布尔值、数字、字符串、数组、元组、枚举、any、void、null、undefined、never、object

any、unknown、never、void

定义

  • any:任意类型的变量
  • unknown:示意未知类型
  • never:永不存在的值的类型
  • void:无任何类型,没有类型

unknown与any相似,但应用前必须进行断言或守卫,从类型推导来讲,unknown是最高级类型,any是unknown的下一级

nerver、void用于函数时,never示意函数用于执行不到返回值那一步(抛出异样或死循环)的返回值类型,即用不存在的值的类型,而void则示意没有返回值,不返回或返回undefined。从类型推导来讲,never是最低层,void与any同级

应用

  • 能不应用any就不必
  • 申明时如果不确定具体的类型,则能够应用unknown代替,在应用时用类型断言或类型守卫进行类型膨胀
  • never罕用于结构条件类型来组合出更灵便的类型定义
  • void罕用于示意类型没有返回值

扩大

any与unknown

在原先的typescript中,any属于top type(最高级类型),在typescript3.0中,unknown才是top type

如果不放大类型,就无奈对unknown类型执行任何操作

function getDog() {  return '22'}cosnt dog: unknown = getDog()dog.hello() // Object is of type 'unknown'

ts高级用法

  • 接口(interface)能够形容一个对象或者函数
  • 类(class)
  • 函数
  • 泛型
  • 枚举
  • 迭代器和生成器
  • 装璜器
  • 继承、多态、重载、重写
  • 抽象类&形象办法

具体应用示例能够看官网

TS编译原理

graph LR源码 --> 扫描器(scanner) --> Token流(两头产物) --> 解析器(parser) --> ASTAST --> 查看器(checker) --> 类型查看性能AST --> 绑定器(binder) --> symbois(符号) -.- 查看器(checker) -.- 发射器AST --> 发射器(emitter) --> javascript代码

实线为主流程,有三条,虚线为独立流程,符号独自指向了查看器,查看器独自指向了发射器

总的来说是

graph LRsourceCode --> 扫描仪 --> token流 --> 解析器 --> ast

token流和ast相似,是扫描之后转换代码的一个两头产物,也是一个对象,不过key和value不一样,然而总体形成是相似的

类型推论图

graphunknown --> anyany --> nullany --> number -.- neverany --> bigint -.- neverany --> boolean -.- neverany --> string -.- neverany --> object --> array --> tuple -.- neverobject --> function -.- neverany --> void --> undefined

面试题

  • 以下代码ts推论进去的类型是什么
let a = 1024 // numberlet b = '1024' // stringconst c = 'apple' // null,const类型推论进去的都是nulllet d = [true, false, true] // array,精确来说是boolean[]let e = {name: 'apple'} // objectlet f = null // null
  • 可赋值性

子集能够赋值给超集,超集不能赋值给子集,除非做出断言

function a(input: string): string {  return input}function b(iniput: string | number) {  return input}// a能够间接赋值给blet input = a()b(input)// 断言办法1:as关键字let input = b()a(input as string)// 断言办法2:通过泛型固定参数类型a(<string>input)

type与interface异同

在官网文档里,形容type的作用是为类型起别名,interface则是偏重形容数据结构的(比方一个对象里蕴含了什么属性)

用法

  • type
type age = numbertype dataType = number | stringtype method = 'GET' | 'POST' | 'PUT' | 'DELETE'type User = {  name: string  age: number}// 合并typetype name = {  name: string}type User = name & {age: string}
  • interface
interface User {  name: string  age: number}// 合并interfaceinterface Admin extends User {  id: number}// interface 也能够合并typetype User = {  name: string  age: number}interface Admin extends User {  id: number}

共同点

  • 都能够形容一个对象或函数
  • interface和type都能够相互拓展,语法上不同,interface应用extends关键字,type是用&符号

不同点

  • type能够用于其余类型(联结类型、元组类型、根本类型(原始值)),interface不反对
type PointX = {x: number}type PointY = {y: number}//联结type Point = PointX | PointY// 元组type Data = [PointX, PointY]// 原始值type Name = Number// typeof的返回值let div = document.createElement('div')type B = typeof div
  • interface能够屡次定义,并主动合并所有成员变量,type不反对
  • type能应用in关键字生成映射类型,interface不反对
type Keys = 'firstname' | 'surname'type DudeType = {  [key in Keys]: string}// 等同于type DudeType = {  firstname: string  surname: string}

装璜器问题

执行程序

  • 有多个参数装璜器时,从最初一个参数顺次向前执行,也就是说装璜器运行程序是倒序的
  • 办法和办法参数中参数装璜器先执行
  • 类装璜器总是最初执行
  • 办法和属性装璜器,谁在后面谁先执行,因为参数是属于办法一部分,所以参数会始终紧紧挨着办法执行

接口类型

  • 属性类接口
  • 函数类接口
  • 可索引接口
  • 类类型接口
  • 扩大接口