Awaited<Type>
Awaited<Type>
用來取出 Promise 的返回值類型突颊,適合用在描述then()
方法和 await 命令的參數(shù)類型律秃。
// string
type A = Awaited<Promise<string>>;
上面示例中糙申,Awaited<Type>
會(huì)返回 Promise 的返回值類型(string)柜裸。
它也可以返回多重 Promise 的返回值類型粱锐。
// number
type B = Awaited<Promise<Promise<number>>>;
如果它的類型參數(shù)不是 Promise 類型卜范,那么就會(huì)原樣返回。
// number | boolean
type C = Awaited<boolean | Promise<number>>;
上面示例中锦爵,類型參數(shù)是一個(gè)聯(lián)合類型险掀,其中的boolean
會(huì)原樣返回,所以最終返回的是number|boolean
冈绊。
Awaited<Type>
的實(shí)現(xiàn)如下死宣。
type Awaited<T> =
T extends null | undefined ? T :
T extends object & {
then(
onfulfilled: infer F,
...args: infer _
): any;
} ? F extends (
value: infer V,
...args: infer _
) => any ? Awaited<...> : never:
T;
ConstructorParameters<Type>
ConstructorParameters<Type>
提取構(gòu)造方法Type
的參數(shù)類型毅该,組成一個(gè)元組類型返回潦牛。
type T1 = ConstructorParameters<
new (x: string, y: number) => object
>; // [x: string, y: number]
type T2 = ConstructorParameters<
new (x?: string) => object
>; // [x?: string | undefined]
它可以返回一些內(nèi)置構(gòu)造方法的參數(shù)類型。
type T1 = ConstructorParameters<
ErrorConstructor
>; // [message?: string]
type T2 = ConstructorParameters<
FunctionConstructor
>; // string[]
type T3 = ConstructorParameters<
RegExpConstructor
>; // [pattern:string|RegExp, flags?:string]
如果參數(shù)類型不是構(gòu)造方法朴爬,就會(huì)報(bào)錯(cuò)召噩。
type T1 = ConstructorParameters<string>; // 報(bào)錯(cuò)
type T2 = ConstructorParameters<Function>; // 報(bào)錯(cuò)
any
類型和never
類型是兩個(gè)特殊值明垢,分別返回unknown[]
和never
痊银。
type T1 = ConstructorParameters<any>; // unknown[]
type T2 = ConstructorParameters<never>; // never
ConstructorParameters<Type>
的實(shí)現(xiàn)如下溯革。
type ConstructorParameters<
T extends abstract new (...args: any) => any
> = T extends abstract new (...args: infer P)
=> any ? P : never
Exclude<UnionType, ExcludedMembers>
Exclude<UnionType, ExcludedMembers>
用來從聯(lián)合類型UnionType
里面,刪除某些類型ExcludedMembers
冈闭,組成一個(gè)新的類型返回萎攒。
type T1 = Exclude<'a'|'b'|'c', 'a'>; // 'b'|'c'
type T2 = Exclude<'a'|'b'|'c', 'a'|'b'>; // 'c'
type T3 = Exclude<string|(() => void), Function>; // string
type T4 = Exclude<string | string[], any[]>; // string
type T5 = Exclude<(() => void) | null, Function>; // null
type T6 = Exclude<200 | 400, 200 | 201>; // 400
type T7 = Exclude<number, boolean>; // number
Exclude<UnionType, ExcludedMembers>
的實(shí)現(xiàn)如下耍休。
type Exclude<T, U> = T extends U ? never : T;