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>
从联合类型中移除null
和undefined
两个成员。
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
除了具体的函数声明、any
和never
外,对其它所有类型进行Parameters<T>
取参都会引起编译错误,取参结果为never
类型。
ConstructorParameters<Type> *
对构造桉树取参,用法参考官方文档。
ReturnType<FunctionType>
获取函数声明的返回值类型。
除了具体的函数声明、any
和never
外,对其它所有类型进行Parameters<T>
取参都会引起编译错误,取参结果为any
类型。
InstanceType<Type>
获取构造函数的实例的类型。
除了构造器声明、any
和never
外,对其它所有类型进行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
评论区