Skip to content

PrimitiveType

基本类型,由numberstringbooleanundefinednullbigintsymbol组成。

Added in v0.0.1

Source

ts
export type PrimitiveType =
  | undefined
  | null
  | number
  | string
  | boolean
  | bigint
  | symbol

NumberString

由数字组成的字符串。

Added in v0.0.1

Source

ts
export type NumberString = `${number}`

PseudoArray

伪数组(Pseudo-array),也被称为类数组对象(Array-like Object),即具有数值型 length 属性的对象。

Added in v0.0.3

Source

ts
export type PseudoArray = object & { length: number }

ObjectLike

非函数对象。

Added in v0.0.1

Source

ts
export type ObjectLike = object & { call?: never; [x: PropertyKey]: any }

ExtractUnion

从元组中提取联合类型。

Added in v0.0.1

Source

ts
export type ExtractUnion<T extends readonly string[]> = {
  [K in keyof T]: T[K]
}[number]

KeyOrIndex

从形如 [${number}] 或 ${number} 的字符串中提取数字。其他情况则返回原始字符串。

Added in v0.0.1

Source

ts
export type KeyOrIndex<T extends string> = T extends
  | `[${infer D extends number}]`
  | `${infer D extends number}`
  ? D
  : T

Tail

获取元组类型最后一个元素。

Added in v0.0.1

Source

ts
export type Tail<T extends readonly any[]> = T extends readonly [
  ...any[],
  infer L
]
  ? L
  : never

Head

获取元组类型第一个元素。

Added in v0.0.1

Source

ts
export type Head<T extends readonly any[]> = T extends readonly [
  infer L,
  ...any[]
]
  ? L
  : never

Edge

获取元组T首端或者末端的元素,由类型D决定。

Added in v0.0.1

Source

ts
export type Edge<
  T extends readonly any[],
  D = 'left' | 'right'
> = D extends 'left' ? Head<T> : Tail<T>

EdgeReverse

Edge类似,但是D取值'left'或者'right'时效果反过来。

Added in v0.0.1

Source

ts
export type EdgeReverse<
  T extends readonly any[],
  D = 'left' | 'right'
> = D extends 'right' ? Head<T> : Tail<T>

EmptyOrParameters

返回函数的参数值类型,若非函数返回never[]类型。

Added in v0.0.1

Source

ts
export type EmptyOrParameters<T> = T extends (...args: any[]) => any
  ? Parameters<T>
  : never[]

EmptyOrReturnType

返回函数的返回值类型,若非函数返回void类型。

Added in v0.0.1

Source

ts
export type EmptyOrReturnType<T> = T extends (...args: any[]) => any
  ? ReturnType<T>
  : void

WithFallback

返回函数 T 的返回值类型,如果是 null 或者 undefined 则返回默认值类型 R

Added in v0.0.2

Source

ts
export type WithFallback<T extends (...args: any[]) => any, R> =
  ReturnType<T> extends undefined | null ? R : ReturnType<T>

LiteralStringWithFallback

当字符串类型 T 太宽泛(例如 string)时,此类型会提供一个默认字符串值 R

它可以确保类型安全,在给配置对象或者可选参数设置默认值时非常有用。

Added in v0.0.2

Source

ts
export type LiteralStringWithFallback<T extends string, R extends string> = T &
  R extends never
  ? T
  : R

MappedTypeByKeyOrIndex

根据输入的字符串或数字索引 T 来生成普通对象或数组类型,该索引指向类型 V,类型 O 控制值是否可选。

Added in v0.0.2

Source

ts
export type MappedTypeByKeyOrIndex<
  T extends string,
  V,
  O extends boolean = false
> =
  KeyOrIndex<T> extends string
    ? O extends false
      ? { [P in T]: V }
      : { [P in T]?: V }
    : O extends false
      ? unknown[] & { [P in KeyOrIndex<T>]: V }
      : unknown[] & { [P in KeyOrIndex<T>]?: V }

DeepMappedTypeByKeyOrIndex

递归地解析字段路径 T 并创建嵌套普通对象或数组,它可以解析类似 "data.[0].name" 这样的嵌套路径字符串,路径末端的字段指向值 VO 控制值是否可选。

在基于字符串模板创建复杂的嵌套类型时非常有用。

Added in v0.0.2

Source

ts
export type DeepMappedTypeByKeyOrIndex<
  T extends string,
  V,
  O extends boolean = false
> = T extends `[${infer Key extends number}][${infer Rest}`
  ? MappedTypeByKeyOrIndex<`${Key}`, DeepMappedTypeByKeyOrIndex<`[${Rest}`, V>>
  : T extends `${infer Key}[${infer Rest}`
    ? MappedTypeByKeyOrIndex<
        `${Key}`,
        DeepMappedTypeByKeyOrIndex<`[${Rest}`, V>
      >
    : T extends `[${infer Key extends number}].${infer Rest}`
      ? MappedTypeByKeyOrIndex<`${Key}`, DeepMappedTypeByKeyOrIndex<Rest, V>>
      : T extends `${infer Key}.${infer Rest}`
        ? MappedTypeByKeyOrIndex<`${Key}`, DeepMappedTypeByKeyOrIndex<Rest, V>>
        : MappedTypeByKeyOrIndex<T, V, O>

DataUnit

DataUnit 类型表示数据大小的不同单位。

Added in v0.0.2

Source

ts
export type DataUnit =
  | 'bit'
  | 'B'
  | 'KB'
  | 'MB'
  | 'GB'
  | 'TB'
  | 'PB'
  | 'EB'
  | 'ZB'
  | 'YB'

Nullish

Nullish 类型表示值为 nullundefined 的类型。

Added in v0.0.4

Source

ts
export type Nullish = undefined | null

SpreadSkipNullish

从左到右合并多个类型,形成一个新的对象类型。

前面对象中非 nullundefined 的字段不会被后面的 nullundefined 的字段覆盖。

Added in v0.0.4

Source

ts
export type SpreadSkipNullish<T, U> = {
  [K in keyof T | keyof U]: K extends keyof T
    ? K extends keyof U
      ? T[K] extends Nullish
        ? U[K]
        : U[K] extends Nullish
          ? T[K]
          : U[K]
      : T[K]
    : K extends keyof U
      ? U[K]
      : never
}

IsAny

IsAny 类型用于判断一个类型是否为 any。 如果 Tany,则结果为 true,否则为 false

Added in v0.0.4

Source

ts
export type IsAny<T> = 0 extends 1 & T ? true : false

ArrayIndexes

ArrayIndexes 类型用于获取数组中元素的索引(不包括数组的通用属性,如 length)。

Added in v0.0.4

Source

ts
export type ArrayIndexes<T extends any[]> = Exclude<
  keyof T,
  keyof any[] | 'length'
> &
  (string | number)

FieldPathComponent

FieldPathComponent 类型用于生成字段路径组件。 如果 Str 是数字或数字字符串,生成如 '[1]' 的路径;如果是字符串,生成如 'a' 的路径。 根据后续是普通对象还是数组,决定是否添加 '.' 作为结尾。

Added in v0.0.4

Source

ts
export type FieldPathComponent<
  Str extends string | number,
  Next extends 'object' | 'array' | void = void
> = Str extends NumberString | number
  ? Next extends 'object'
    ? `[${Str & (string | number)}].`
    : `[${Str & (string | number)}]`
  : Next extends 'object'
    ? `${Str & string}.`
    : `${Str & string}`

FlattenArrayObject

FlattenArrayObject 类型用于将数组中的对象扁平化为联合类型。它会递归地处理数组中的每个元素,根据元素的类型(对象或数组)继续扁平化。

Added in v0.0.4

Source

ts
export type FlattenArrayObject<
  T extends Array<any>,
  Prefix extends string = ''
> = {
  [K in number | ArrayIndexes<T>]: IsAny<T[K]> extends true
    ? { [P in `${Prefix}${FieldPathComponent<K>}`]: T[K] }
    : T[K] extends never
      ? never
      : T[K] extends object
        ? T[K] extends Array<any>
          ? FlattenArrayObject<
              T[K],
              `${Prefix}${FieldPathComponent<K, 'array'>}`
            >
          : FlattenObject<T[K], `${Prefix}${FieldPathComponent<K, 'object'>}`>
        : { [P in `${Prefix}${FieldPathComponent<K>}`]: T[K] }
}[ArrayIndexes<T> | number]

FlattenObject

FlattenObject 类型用于将对象扁平化为联合类型。它会递归地处理对象的每个字段,根据字段的类型(对象或数组)继续扁平化。

Added in v0.0.4

Source

ts
export type FlattenObject<T, Prefix extends string = ''> = {
  [K in keyof T & string]: IsAny<T[K]> extends true
    ? { [P in `${Prefix}${FieldPathComponent<K>}`]: T[K] }
    : T[K] extends never
      ? never
      : T[K] extends object
        ? T[K] extends Array<any>
          ? FlattenArrayObject<
              T[K],
              `${Prefix}${FieldPathComponent<K, 'array'>}`
            >
          : FlattenObject<T[K], `${Prefix}${FieldPathComponent<K, 'object'>}`>
        : { [P in `${Prefix}${FieldPathComponent<K>}`]: T[K] }
}[keyof T & string]

UnionToIntersection

UnionToIntersection 类型用于将联合类型转换为交叉类型。例如,A | B 会被转换为 A & B

Added in v0.0.4

Source

ts
export type UnionToIntersection<U> = (
  U extends any ? (x: U) => any : never
) extends (x: infer R) => any
  ? R
  : never

IntersectionToObject

IntersectionToObject 类型用于将交叉类型转换为对象类型。例如,A & B 会被转换为 { [K in keyof (A & B)]: (A & B)[K] }

Added in v0.0.4

Source

ts
export type IntersectionToObject<U> = {
  [K in keyof UnionToIntersection<U>]: UnionToIntersection<U>[K]
}

FlattenNestObject

FlattenNestObject 类型用于将嵌套对象扁平化为新的对象类型。它通过 FlattenObject 将对象扁平化为联合类型,然后通过 UnionToIntersection将联合类型转换为交叉类型,最终通过 IntersectionToObject 将交叉类型转换为对象类型。

Added in v0.0.4

Source

ts
export type FlattenNestObject<T extends object> = IntersectionToObject<
  UnionToIntersection<FlattenObject<T>>
>