侧边栏壁纸
  • 累计撰写 218 篇文章
  • 累计创建 59 个标签
  • 累计收到 5 条评论

TypeScript 内置的类型转换工具

barwe
2022-04-16 / 0 评论 / 0 点赞 / 1,426 阅读 / 3,591 字
温馨提示:
本文最后更新于 2023-06-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

TypeScript 提供了几个工具来从已有的类型构造新的类型。

Partial<Type>

复制指定类型的所有属性,并将它们设为 可选 属性。

type User = { name: string; age: number; }

type PartialUser = Partial<User>
// type PartialUser = { name?: string; age?: number; }

Required<Type>

复制指定类型的所有属性,并将它们设为 必须 属性。

Required<User> 相当于

type User = { name: string; age?: number; }

type RequiredUser = Required<User>
// type RequiredUser = { name: string; age: number; }

Readonly<Type>

复制指定类型的所有属性,并将它们设为 只读 属性。

Readonly<User> 相当于

type User = { name: string; age: number; }

type ReadonlyUser = Readonly<User>
/* 
type ReadonlyUser = {
  readonly name: string; 
  readonly age: number;
}
*/

Record<Keys, Type>

通过指定键和值的类型来声明一个对象的类型。

type SNRecord = Record<string, number>
type SARecord = Record<string, any>

Pick<Type, Keys>

复制指定类型的部分属性。

type User = { id: number; name: string; age?: number; }

type PickUser = Pick<User, "name">
// type PickUser = { name: string }

type PickUser2 = Pick<User, "id" | "age">
// type PickUser2 = { id: number; age?: number; }

Omit<Type, Keys>

复制指定类型的所有属性,然后移除部分属性。

type User = { id: number; name: string; age?: number; }

type OmitUser = Omit<User, "id">
// type OmitUser = { name: string; age?: number; }

type OmitUser2 = Omit<User, "id" | "age">
// type OmitUser2 = { name: string }

Exclude<UnionType, ExcludedMembers>

联合类型 中移除指定的成员。

type T0 = Exclude<"A" | "T" | "C" | "G" | "N", "N">
// type T0 = "A" | "T" | "C" | "G"

type T1 = Exclude<string | number | (() => void), Function>
// type T1 = string | number

Extract<UnionType, ExtractedTypes>

联合类型 中提取指定的成员,成员存在时则提取,不存在时则忽略。

type T0 = Extract<"A" | "T" | "C" | "G" | "N", "A" | "F">
// type T0 = "A"

type T1 = Extract<"A" | "T" | "C" | "G" | "N", "A" | "F" | "G">
// type T1 = "A" | "G"

type T2 = Extract<string | number | (() => void), Function>
// type T2 =() => void

NonNullable<Type>

从联合类型中移除nullundefined两个成员。

type T1 = NonNullable<User | null | undefined>
// type T1 = User

type T2 = string | number | null
// type T2 = string | number

Parameters<FunctionType>

一般用来获取函数的参数类型。

多个参数以元祖形式表示。

declare function add(x: number, y: number, option?: {round?: number}): number

/*
通过 typeof 获取函数的完整声明
typeof add 相当于
(x: number, y: number, option?: { round?: number | undefined } | undefined) => number;
*/

type AddParams = Parameters<typeof add>
/*
type AddParams = [
	x: number,
	y: number,
	options?: {
		round?: number | undefined;
	} | undefined
]
*/
                            
type T2 = Parameters<() => void>
// type T2 = []

如果是个 泛型函数,类型为泛型的参数会被转换为unknown

type T0 = Parameters<T(x: number, y: T) => void>
// type T0 = [x: number, y: unknown]

any类型是所有类型(包括函数类型)的子类型:

type T0 = Parameters<any>
// type T0 = unknown[]
// unknown[] 表示这是一个参数数量和类型都任意的函数,相当于啥都没约定

never是一个特殊的类型,对never取参数不是一个符合预期的操作,构建的类型还是never

type T0 = Parameters<never>
// type T0 = never

除了具体的函数声明、anynever外,对其它所有类型进行Parameters<T>取参都会引起编译错误,取参结果为never类型。

ConstructorParameters<Type> *

对构造桉树取参,用法参考官方文档

ReturnType<FunctionType>

获取函数声明的返回值类型。

除了具体的函数声明、anynever外,对其它所有类型进行Parameters<T>取参都会引起编译错误,取参结果为any类型。

InstanceType<Type>

获取构造函数的实例的类型。

除了构造器声明、anynever外,对其它所有类型进行Parameters<T>取参都会引起编译错误,取参结果为any类型。

ThisParameterType<Type>

如果一个函数有this参数,返回该参数的类型。如果没有这个参数,返回unknown

function print(this: User) {
  console.log(this.name)
}

type T0 = ThisParameterType<typeof print>
// type T0 = User

OmitThisParameter<Type> *

略。

ThisType<Type> *

略。

内置字符串操作类型

  • Uppercase<StringType>
  • Lowercase<StringType>
  • Capitalize<StringType>
  • Uncapitalize<StringType>

参考

https://www.typescriptlang.org/docs/handbook/utility-types.html

0

评论区