/** ***************************************** * Created by edonet@163.com * Created on 2021-03-29 22:28:50 ***************************************** */ 'use strict'; /** ***************************************** * 未知类型 ***************************************** */ export type U = unknown; /** ***************************************** * 未知对象 ***************************************** */ export type O = { [key: string]: U }; /** ***************************************** * 函数 ***************************************** */ export type F = (...args: any[]) => unknown; /** ***************************************** * 函数重载参数列表 ***************************************** */ export type FOP = ( T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void, (...args: infer P4): void, (...args: infer P5): void, (...args: infer P6): void, (...args: infer P7): void, (...args: infer P8): void } ? [P1, P2, P3, P4, P5, P6, P7, P8] : T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void, (...args: infer P4): void, (...args: infer P5): void, (...args: infer P6): void, (...args: infer P7): void } ? [P1, P2, P3, P4, P5, P6, P7] : T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void, (...args: infer P4): void, (...args: infer P5): void, (...args: infer P6): void } ? [P1, P2, P3, P4, P5, P6] : T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void, (...args: infer P4): void, (...args: infer P5): void } ? [P1, P2, P3, P4, P5] : T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void, (...args: infer P4): void } ? [P1, P2, P3, P4] : T extends { (...args: infer P1): void, (...args: infer P2): void, (...args: infer P3): void } ? [P1, P2, P3] : T extends { (...args: infer P1): void, (...args: infer P2): void } ? [P1, P2] : T extends { (...args: infer P1): void } ? [P1] : [] ); /** ***************************************** * 首位 ***************************************** */ export type Head = ( T extends [head: infer V, ...rest: U[]] ? V : never ); /** ***************************************** * 末位 ***************************************** */ export type Tail = ( T extends [...rest: U[], tail: infer V] ? V : never ); /** ***************************************** * 去首 ***************************************** */ export type Shift = ( T extends [head: U, ...rest: infer V] ? V : [] ); /** ***************************************** * 压入栈首 ***************************************** */ export type Unshift = ( T extends [...rest: infer V, tail: infer W] ? [...Unshift, W] : [P] ); /** ***************************************** * 去尾 ***************************************** */ export type Pop = ( T extends [...rest: infer V, tail: U] ? V : [] ); /** ***************************************** * 压入栈尾 ***************************************** */ export type Push = ( T extends [head: infer V, ...rest: infer W] ? [V, ...Push] : [P] ); /** ***************************************** * 查找 ***************************************** */ export type Find = ( T extends [head: infer V, ...rest: infer W] ? P extends V ? V : Find : Q ); /** ***************************************** * 合并属性 ***************************************** */ export type Extend = { [K in keyof (T & P)]: ( K extends keyof P ? P[K] : K extends keyof T ? T[K] : never ); }