ts类型疑点难点

52 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

获取枚举类型key组成的联合类型和枚举类型value组成的联合类型

正好遇到一个问题。怎么获取枚举类型的key的联合类型,和枚举类型的值的联合类型。,感觉没什么道理,但是就是这样解决的。这个解决方法很niu,记录一下子

 enum ENUM_A{
  a='n',
  b="t",
  c="h"
}
// 获取枚举的 value
type IValue = `${ENUM_A}`  // "n" | "t" | "h"


// 获取枚举的 key
type IKey = keyof typeof ENUM_A  // "a" | "b" | "c"

// 获取枚举的key和value组成的联合类型
type IKeyValue = keyof typeof ENUM_A |`${ENUM_A}` // "a" | "b" | "c" | "n" | "t" | "h"

Record (将联合类型映射成指定类型的对象)

紧急复习一下 内置工具类型,Record ,第一个泛型的所有联合类型当成新类型的key,第二个泛型当成新类型的值的类型

type Record1<K extends string | number | symbol, T> = {
  [P in K]: T
}
type Property = 'user1' | 'user2'

type User = Record1<Property, string>
// type User = {
//   user1: string;
//   user2: string;
// }

Readonly (将一个类型的所有属性都搞成只读的) 针对的是复杂类型

内置的Readonly 工具类型,接受一个类型,然后将所有的属性都改成只读属性

Requrired 和 Readonly 是一个非常类似的东西,属性后面加一个 -? 就是删除了可选符号,反过来加上?,映射的类型就是可选属性了

type User = {
  user1: string
  user2: string
}
type MyReadonly<T> = {
  readonly [K in keyof T]: T[K]
}
type ReadonlyUser = MyReadonly<User>

Extract(从第一个联合类型中提取第二个泛型) 提取

type User = {
  user1: string
  user2: string
}

type ReadonlyUser = Extract<keyof User,'user1'>

Exclude (从第一个联合类型中移除出第二个类型) 和提取正好对应

Pick (从第一个泛型类型中挑出匹配第二个类型的属性)

Pick 接受两个泛型 第一个是复杂类型,第二个是第一个类型的key的字面量类型,根据后面挑选的多少,决定新类型的属性个数,值的类型保持不变

Omit (从第一个泛型类型中干掉所有和第二个联合类型匹配的属性)

Omit 和 Pick是一对,主要处理 复杂类型

NonNullable 删除掉联合类型中的null 和 undefined

获取 Parameters

Parameters 返回函数的参数组成的元组类型 ReturnType 返回函数的返回值类型

type MyRet<T extends (...arg:any) => any> = T extends (...arg:any) => infer P ? P : any
type P = ReturnType<typeof fn>