TypeScript | 青训营笔记

61 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第4天

1.重点内容

  • TypeScript的发展历史
  • TypeScript的数据类型

2.详细知识

2.1 基本类型

2.1.1 基本数据类型

string,number, boolean, null, undefined, symbol, bigint

// 定义基本类型
 let num:number = 12

2.1.2 对象类型

// 定义一个对象类型
interface IBytedancer {
    // 只读属性
    readonly id: number
    name: string
    sex: 'man' | 'woman' | 'other'
    // 可选属性
    hbby?:string
    // 任意属性
    [key: string]: any 
}

//使用
const bytedancer: IBytedancer = {
    id: 12,
    name: 'hae',
    sex: 'woman',
    hbby: 'dre',
    tName: 'dd'
}

2.1.3 函数类型

两种声明方式

// 方式1:单独指定参数
function add(x:number, y:number):number {
    return x + y
}

// 方式2:同时指定参数
const add: (x:number, y:number)=>number = (x, y)=> {
    return x+y
}

2.1.4 数组类型

// 类型 + 方括号
type IArr1 = number[]
type IArr2 = (number | string) []
// 泛型
type IArr3 = Array<string | number>
// 元组
type IArr4 = [number, number2, string]
// 接口表示
interface IArr5 {
    [key:number]:any
}

2.1.5 补充类型

// 空类型
type IEmptyFunction = () => void
// 任意类型
type IAnyType = any
// 枚举类型
enum EnumExample {
add = '+',
mult = '*'
}

2.1.6 泛型

// 泛型接口
interface IX<T, U> {
    key: T,
    val: U
}
//泛型类
class IMan<T> {
instance: T
}
// 泛型别名
type  ITypeArr<T> = Array<T>

泛型约束

我们可以给泛型添加约束,使他必须符合指定类型

// 泛型约束:限制泛型必须为string 或者number
type IGetRepeatStringArr = <T extends string | number>(target: T) => T[]
const getStrArr: IGetRepeatStringArr = (target) => new Array(100).fill(target)

getStrArr('ddd')
getStrArr(123)

// 泛型参数默认类型
type IGetRepeatArr<T = number | string> = (target: T) => T[]
const getRepeatArr: IGetRepeatArr = (target) => new Array(100).fill(target)
getRepeatArr('123')

2.2 高级数据类型

2.2.1联合/交叉类型

当我们需要为以下数据赋予类型时

const bookList: IBookList = [
  {
    author: 'xiaoming',
    type: 'history',
    range: '2001-2021',
  },
  {
    author: 'xiaoli',
    type: 'story',
    theme: 'love',
  },
]

就只能这样

interface IHistoryBook {
  author: string
  type: string
  range: string
}
interface IStoryBook {
  author: string
  type: string
  theme: string
}

type IBookList = Array<IHistoryBook | IStoryBook>

这样定义,复杂而又繁琐, 现在可以通过联合交叉类型定义

type IBookList2 = Array<
  {
    author: string
  } & (
    | {
        type: 'history'
        range: string
      }
    | {
        type: 'story'
        theme: string
      }
  )
>
  • 联合类型: IA | IB; 联合类型标识一个值可以时几种类型之一
  • 交叉类型: IA & IB; 多种类型叠加到一起成为一种类型, 它包含了所需的所有类型的特性

2.2.2 类型保护与类型守卫

当我们访问联合类型时,处于程序安全, 仅能访问联合类中的交集部分,直接访问会报错, 这时我们可以定义一个类型守卫

interface IA {
  a: 1
  a1: 2
}
interface IB {
  b: 1
  b1: 2
}

// 类型守卫:定义一个函数,他的返回值是一个类型谓词,生效范围为子作用域
function getIsIA(arg: IA | IB): arg is IA {
  return !!(arg as IA).a
}
function log(arg: IA | IB) {
  if (getIsIA(arg)) {
    console.log(arg.a1)
  } else {
    console.log(arg.b1)
  }
}

课后总结

感觉这一章很难,我需要花多一点的时间才能掌握, 中间很多知识点, 很多写法,都是我完全没有接触过的,还得更加努力学习才行