typescript 入门-工具类型

type 类型别名

// 为某类型指定别名
type Name = string
type Age = number
type Man = {
  name: Name
  age: Age
}

const c: Man = {
  name: 'c',
  age: 20
}

keyof 对象键类型

type _Object = { [key: string]: unknown }

function getKeysByObj<T extends _Object>(o: T): (keyof T)[]{
  return Object.keys(o)
}

const a = {
  name: 'a',
  age: 12
}

const aKeys = getKeysByObj(a)
// aKeys: ('name' | 'age')[]

const b = {
  1: 'b',
  2: 20
}

const bKeys = getKeysByObj(b)
// bKeys: (1|2)[]

typeof 值类型

const a = {
  name: 'a',
  age: 23
}
// 通过 typeof b 获取 a的类型定义
const b: typeof a = {
  name: 'b',
  age: 10
}

/**
 * a 类型定义
 * {
 *   name: string,
 *   age: number
 *  }
 */

// 获取函数定义
function random(n: number): number{
  return Math.random() * n
}

type Random = typeof random
// (n:number) => number

Partial<T> 转为可选参数

interface Man {
  name: string,
  age: number
}
// 将Man的所有属性改为可选
type ManCopy = Partial<Man>

const cache: ManCopy = {}
// ManCopy { name?: string, age?: number }

Required<T> 将属性全转为必填

interface Data {
  id: string
  type?: string
}

type FullData = Required<Data>

const fd: FullData = {
  id: 'xx',
  type: 'su'
}

Readonly <T> 属性都转为只读

interface Data {
  id: string
  type?: string
}

type ReadonlyData = Readonly<Data>

const d:ReadonlyData = {
  id: 'xx',
}

d.id = 'cc'
//  Cannot assign to 'id' because it is a read-only property.

Record<K, T> 定义 K 为键, T 为值的映射类型

type keys = 'name' | 'job' | 'age'
type Man = Record<keys, string>

const m: Man = {
  name: 'm',
  job: 't',
  age: '10',
}

/**
 * {
 *  name: string,
 *  job: string,
 *  age: string
 * }
 */

Pick 提取指定属性,生成新类型

interface Man {
  id: string
  name: string
  age: number
  job: string
  birth: string
  address: string
}

// 提取指定属性类型
type ManIt = Pick<Man, 'name' | 'age' | 'job'>

const m: ManIt = {
  name: 'm',
  age: 25,
  job: 'tt'
}

/**
 * {
 *   name: string,
 *   age: number,
 *   job: string
 * }
 */

Omit 删除指定属性,生成新类型

type A = 'color' | 'width' | 'height'
type B = {
  name: string
  width: number
  height: number
}

type C = Omit<B, A>
// { name: string }

Exclude<K, T> 联合类型取 K,T 的差集

interface A{
  name: string
  color: string
}

interface B{
  name: string,
  width: number
}

type keys = Exclude<keyof A, keyof B>
type C = Record<keys, string>

const c: C = {
  color: 'orange'
}

/**
 * {
 *  color: string
 * }
 */

Extract<A, B> 联合类型取 A, B的并集

type A = 'color' | 'width' | 'height'
type B = 'name' | 'height'
type C = Extract<A, B>
// "height"

NonNullable 过滤类型内的 null 、 undefined、never

type A = 'data' | null | undefined | never
type B = NonNullable<A>
// type "data"

type T1 = NonNullable<null>
// never
type T2 = NonNullable<undefined>
// never
type T3 = NonNullable<never>
// nerver
type T4 = NonNullable<any>
// any
type T5 = NonNullable<string>
// string

Parameters<FN> 获取函数参数类型元组

function buildCar(name: string, color: string){
  return { name, color }
}

const args: Parameters<typeof buildCar> = ['xx', 'yy']
// ('string', 'string')

console.log(buildCar(...args))
// { name: 'xx', color: 'yy'

ConstructorParameters<constructor> 获取构造函数参数类型元组

class Car{
  name:string
  color:string

  constructor(name: string, color:string){
    this.name = name
    this.color = color
  }

}

interface CarConstructor{
  new (name: string, color:string): Car
}

const args:ConstructorParameters<CarConstructor> = ['mini', 'blue']
// type ['string', 'string']

const c = new Car(...args)

InstanceType<constructor> 获取构造函数返回值类型

class Car{
  name:string
  color:string

  constructor(name: string, color:string){
    this.name = name
    this.color = color
  }

}

interface CarConstructor{
  new (name: string, color:string): Car
}

type c = InstanceType<CarConstructor>
// type Car

ReturnType<T> 函数返回值类型

function getNumber(): number{
  return Math.random()
}

function getString(): string{
  return `${Math.random()}`
}

let a:ReturnType<typeof getNumber>
let b: ReturnType<typeof getString>

a = 10
b = 'msg'

Uppercase 字符字面量全大写

type Status = 'success' | 'fail'
type STATUS = Uppercase<Status>
// type "SUCCESS" | "FAIL"

Lowercase 字符字面量全小写

type Status = "SUCCESS" | "FAIL"
type status = Lowercase<Status>
// type "success" | "fail"

Capitalize 字符字面量首字母大写

type Status = "success" | "FAIL"
type status = Capitalize<Status>
// type "FAIL" | "Success"

UnCapitalize 字符字面量首字母小写

type Status = "success" | "FAIL"
type status = Uncapitalize<Status>
// type "success" | "fAIL"

ThisType 明确当前函数this的指向类型

// 没有ThisType情况下
const foo = {
    bar() {
         console.log(this.a); // error,在foo中只有bar一个函数,不存在a
    }
}

// 使用ThisType
const foo: { bar: any } & ThisType<{ a: number }> = {
    bar() {
         console.log(this.bar) // error,因为没有在ThisType中定义
         console.log(this.a); // ok
    }
}

foo.bar // ok
foo.a // error,在外面的话,就跟ThisType没有关系了

ThisParameterType 获取函数this指向类型

interface Car{
  name: string
  color: string
}

function getCarName(this: Car){
  console.log(this.name)
}

const c = {
  name: 'x',
  color: 'y',
}

getCarName.apply(c)
// x

type T = ThisParameterType<typeof getCarName>
// type Car
// 函数 getCarName this 类型指向Car

OmitThisParameter 获取一个没有this指向的函数类型

interface Car{
  name: string
  color: string
}

function getCarName(this: Car){
  console.log(this.name)
}

type T = OmitThisParameter<typeof getCarName>
// type () => void

const fn: T = () => {
  console.log('not name')
}

infer 替代推断类型

type Unpacked<T> =  T extends (infer U)[] ? U : T;

type T0 = Unpacked<string[]>; // string
type T1 = Unpacked<string>; // string

文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容