全局工具

TypeScript提供了一些实用工具类型,这些工具类型全局可用。

异步

Awaited<Type>

Awaited用于获取Promise<Type>中的Type类型,这和async函数中的await很相似,只不过async函数中的await是取得Promise的值,而Awaited则是取得值的类型。

Type不仅可以是一个Promise类型,也可以是一个嵌套的Promise类型、字符串等基本类型,甚至还可以是一个联合类型。

type A = Awaited<Promise<string>>;
// A = string;
type A = Awaited<Promise<Promise<number>>>;
// A = string;
type A = Awaited<string>
// A = string;
type A = Awaited<boolean | Promise<number>>;
// A = boolean | number

示例

type GetListType = ()=>Promise<string>
const getList:GetListType = ()=> new Promise((resolve)=>{
    setTimeout(()=>{
        resolve('123')
    }, 1000)
})

async function fn(){
    // ReturnType接收函数,并返回该函数返回值的类型
    // 在这个例子里ReturnType<GetListType> = Promise<string>
    const res:Awaited<ReturnType<GetListType>> = await getList()
}

对象属性转换

Partial<Type>

Partial的作用是将Type中所有的属性都转换成可选的。

例如有些时候我们需要将接口中的所有属性都转换成可选的,这个时候没必要再重新写一遍,只需要用Partial类型转换一下即可。

interface Person {
    name: string;
    age: number
}

type ChangePersonType = Partial<Person>

function changePerson(arg: ChangePersonType){

}
changePerson({name: '李四'}) // ✔
changePerson({name: '李四',age: 18}) // ✔

Required<Type>

Required类型的作用刚好与Partial相反,它会将Type内的所有属性都转换成必填的。

type CreatePersonType = Required<ChangePersonType>

function createPerson(arg: CreatePersonType){

}
createPerson({name: '李四',age: 18}) // ✔
createPerson({name: '李四'})     // ✖

Readonly<Type>