TypeScript-10.高级类型2

笔记。看到34min。任务排期到7.30 冲啊。

  • this类型
  • 索引类型: 索引类型查询操作符 、索引访问操作符
  • 映射类型: 基础 由映射类型进行推断 增加或移除特定修饰符 keyof和映射类型在2.9的升级 元组和数组上的映射类型
  • 条件类型: 基础 分布式条件类型 条件类型的类型推断-infer TS预定条件类型
// 一、 this
class Counter {
  constructor(public count: number = 0) {}
  add(value: number) {
    this.count += value
    return this
  }
  subtract(value: number) {
    this.count -= value
    return this
  }
}
let counter1 = new Counter(10)
console.log(counter1.add(3).subtract(2))

class PowCounter extends Counter {
  constructor(public count: number = 0) {
    super(count)
  }
  pow(value: number) {
    this.count = this.count ** value // ES7 幂运算符
    return this
  }
}
let powCounter = new PowCounter(2)
console.log(powCounter.pow(8).add(3))

// 二、索引类型
// 1.索引类型查询操作符 keyof
interface Infoo {
  name: string
  age: number
}
let infoProp: keyof Infoo
infoProp = 'name'
// infoProp = 'sex' 报错

function getValue<T, K extends keyof T>(obj: T, names: K[]) {
  return names.map(n => obj[n])
}
const infoObj = {
  name: 'dan',
  age: 111,
  sex: 'wo',
  constellation: 'Aries'
}
let val: (string | number)[] = getValue(infoObj, ['age', 'name'])
console.log(val)

// 2.索引访问操作符 []
type NameTypes = Infoo['name']

function getProperty<T, K extends keyof T>(o: T, name: K): T[K] {
  return o[name]
}

interface Objs<T> {
  [key: string]: T
}
const objs1: Objs<number> = {
  age: 8
}
let keys: keyof Objs<number>
let keys2: Objs<number>['name']

interface Type {
  a: never
  b: never
  c: string
  d: number
  e: undefined
  f: null
  g: object
}
type Test = Type[keyof Type]

// 三、映射类型
interface Info1 {
  age: number
  name: string
  sex: string
}
type ReadonlyType<T> = { // 映射类型
  readonly [P in keyof T]?: T[P] // ?可选属性
}
type ReadonlyInfo1 = ReadonlyType<Info1>
let info8: ReadonlyInfo1 = {
  age: 11,
  name: 'd'
}
// info8.age = 33 readonly不可改

// 5个内置映射类型
// Readonly(只读的) Partial(?可选的) Required(-?)
// Pick(从一个复合类型中,取出几个想要的类型的组合)
// Record(将一个类型的所有属性值都映射到另一个类型上并创造一个新的类型)

// type Pick<T, K extends keyof T> = { // 源码 => lib.es5.d.ts
//   [P in K]: T[P]
// }

interface Info9 {
  name: string
  age: number
  address: string
}
const info9: Info9 = {
  name: 'vv',
  age: 99,
  address: 'sh'
}
function pick<T, K extends keyof T>(obj: T, keys: K[]): Pick<T, K> {
  const res: any = {}
  keys.map(key => {
    res[key] = obj[key]
  })
  return res
}
const nameAndAddress = pick(info9, ['name', 'age'])

这节课97min,今天听不完,留坑。

困得一比。什么时候才能找回我的睡眠。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值