TypeScript类型学习实练-高级类型1

173 阅读3分钟

这是我参与11月更文挑战的第25天,活动详情查看:2021最后一次更文挑战

前言

前面更文通过学习 TS 的类型/枚举/函数/类/泛型等基础类型和特殊类型, 已经对 TS 有了初步的了解熟悉, 其中有和 JS 中并存的知识点, 也有相对 JS 没有的, 本文继续来学习 TS 重要知识点 -- 高级类型1

现在 TypeScript + Vue3 应用已经挺广的, 不学习是会跟不上大厂的节奏. 学习 TypeScript(虽然觉得也是可选的,但还是要学,真卷...) 这里有记录学习 TypeScript 的过程, 收录在 TypeScript 实战专栏

Typescript 相关文档

Typescript 官网地址: typescriptlang.org/zh/

Typescript 中文文档:高级类型

TypeScript 高级类型

本文来学习 TypeScript里的 高级类型:

  1. 交叉类型(Intersection Types)
  2. 联合类型(Union Types)
  3. 枚举成员类型
  4. 可辨识联合(Discriminated Unions)
  5. 索引类型(Index types)

1. 交叉类型(Intersection Types)

交叉类型是通过将多个类型合并为一个类型。 这样可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性: T & U & 也就是这个类型的对象同时拥有了 T 和 U ... 这些类型的成员. 在 JavaScript 中有很多使用的地方: mixin 或其他不适合典型地面向对象的地方使用交叉类型.

function mixin<T, U>(first: T, second: U): T & U {
  let result = <T & U>{}
  ///...
  for (let id in first) {
    ;(<T>result)[id] = first[id]
  }
  for (let id in second) {
    if (!result.hasOwnProperty(id)) {
      ;(<U>result)[id] = second[id]
    }
  }
  return result
}

/// xn 同时混入了 x 和 n 属性
let xn = mixin({ x: 'x' }, { n: 213 })
let xnx = xn.x
let xnn = xn.n

3. 枚举成员类型

枚举: 当每个枚举成员都是用字面量初始化的时候枚举成员是具有类型的

5. 索引类型(Index types)

通过利用索引类型, 让编译器能够检查使用了动态属性名的代码, 比如: 一个常见的 JS 的模式就是从对象中选取属性的子集:

在 TypeScript 里使用下面的函数,通过 索引类型查询和 索引访问操作符: 定义一个函数:

function mapData(dataList, pros) {
  return pros.map((p) => dataList[p])
}
function mapData<T, K extends keyof T>(dataList: T, pros: K[]): T[K][] {
  return pros.map((p) => dataList[p])
}

interface Person {
  name: string
  id: number
}
let person: Person = {
  name: 'xn213',
  id: 213,
}
let strings: string[] = mapData(person, ['name']) //  string[]

Vue3 学习实战系列更文:

  1. Vue3 源码学习-工具函数 utils(二)
  2. Vue3-初体验,
  3. Vue3-生命周期setup()函数,
  4. Vue3-computed & watch,
  5. Vue3-Teleport 改变组件挂载的根节点,
  6. Vue3-Suspense 处理异步请求,
  7. Vue3-defAsyncComponent 异步组件(新增),
  8. Vue3-fragments (新增),
  9. Vue3-v-model (非兼容),
  1. TypeScript 系列: