typescript 基础

作用

  • 方便开发,如果有类型错误,编译的时候就会抛出错误,而不是一直不知道

类型

类型声明

ts 可以根据上下文自动指定类型
·let num = 123 // number 也可以显式声明类型
let str:string= ‘abc’

基本类型

boolean、string、number、array、null、object 等与js类似

类数组类型

  • tuple 元组类型 固定类型和长度的数组
    let person1: [number, string] = [1, 'holiday']
  • enum 枚举类型
enum Color {
  red,
  green,
  blue
}
console.log(Color.green) // 1

空类型组

  • undefined
  • void 不存在,多用于函数没有return
  • never 多用于抛出异常的函数

灵活类型

  • any 指的是匹配任何类型
  • unkonwn 类型未定时候使用 unknown 类型会比 any 更加安全。这个安全体现在,虽然它和 any 一样存储了任意类型的值,但是具体使用的时候,这个类型需要显式确定,由使用者进行指定将 unknown 转换成某一确定类型。

高级类型

union 组合类型 //let union:string | number
Nullable 可空类型
Literal 字面量类型 // const num = 3; let lit: 1|3|‘mit’|true

接口和类

interface 关键字定义一个接口,目的是规范一个类的属性和方法,Java等后台语言中经常使用

例如:我们定义一个Ipoint接口

interface IPoint {
  x: number
  y: number
  getDistance: (p: IPoint) => number
}

关于类,es6+已有充分的表述, 为实现上述接口定义的类

class Point implements IPoint {
  x: number
  y: number
  getDistance = (p:IPoint) => {
    return this.x-this.y
  }
}

Acess Modifier 访问修饰符

public private protected

  • public 修饰的属性或方法是公有的,可以在任何地方被访问到,默认所有的属性和方法都是 public 的
  • private 修饰的属性或方法是私有的,不能在声明它的类的外部访问
  • protected 修饰的属性或方法是受保护的,它和 private 类似,区别是它在子类中也是允许被访问的

如果要想访问private 修饰的私有属性,需要在类的内部定义get和set方法,ts 语法糖, set/get + 空格 + 方法名,可以作为对外暴露的变量使用

class Point {
  private x:number
  get X() {
    return this.x
  }
  set Y(x:number) {
    this.x = x
  }
}
let point = new Point()
point.X = 2
point.X // 2

Generics 泛型

Generics 泛型 指的是在数组中规定类型,函数传参中适配类型

let arr: Array<number> = [1,2,3,4]
let arr: number[] = [1,2,3,4] // 同上

let lastInArray = <T>(arr: T[]) => { // T 表示传一个类型过来,T约定俗成 表示无论传来什么值都能适配
  return arr[arr.length - 1]
}
const l1 = lastInArray([1,2,3,4])
const l2 = lastInArray(['a','b', 'c', 'd',1]) // 隐式声明
const l3 = lastInArray<number | string>(['a','b', 'c', 'd',1]) // 显式声明

// 用于传参适配

function add1<T, Y>(a: T, b: Y ) {
  return [a, b]
}

let r1 = add1(1, 2)
let r2 = add1<number, string>(1, 'ddsd')