PrimitiveType
基本类型,由number
、string
、boolean
、undefined
、null
、bigint
、symbol
组成。
Added in v0.0.1
Source
export type PrimitiveType =
| undefined
| null
| number
| string
| boolean
| bigint
| symbol
NumberString
由数字组成的字符串。
Added in v0.0.1
Source
export type NumberString = `${number}`
PseudoArray
伪数组(Pseudo-array),也被称为类数组对象(Array-like Object),即具有数值型 length
属性的对象。
Added in v0.0.3
Source
export type PseudoArray = object & { length: number }
ObjectLike
非函数对象。
Added in v0.0.1
Source
export type ObjectLike = object & { call?: never; [x: PropertyKey]: any }
ExtractUnion
从元组中提取联合类型。
Added in v0.0.1
Source
export type ExtractUnion<T extends readonly string[]> = {
[K in keyof T]: T[K]
}[number]
KeyOrIndex
从形如 [${number}] 或 ${number} 的字符串中提取数字。其他情况则返回原始字符串。
Added in v0.0.1
Source
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
export type Tail<T extends readonly any[]> = T extends readonly [
...any[],
infer L
]
? L
: never
Head
获取元组类型第一个元素。
Added in v0.0.1
Source
export type Head<T extends readonly any[]> = T extends readonly [
infer L,
...any[]
]
? L
: never
Edge
获取元组T
首端或者末端的元素,由类型D
决定。
Added in v0.0.1
Source
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
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
export type EmptyOrParameters<T> = T extends (...args: any[]) => any
? Parameters<T>
: never[]
EmptyOrReturnType
返回函数的返回值类型,若非函数返回void
类型。
Added in v0.0.1
Source
export type EmptyOrReturnType<T> = T extends (...args: any[]) => any
? ReturnType<T>
: void
WithFallback
返回函数 T
的返回值类型,如果是 null
或者 undefined
则返回默认值类型 R
。
Added in v0.0.2
Source
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
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
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"
这样的嵌套路径字符串,路径末端的字段指向值 V
。O
控制值是否可选。
在基于字符串模板创建复杂的嵌套类型时非常有用。
Added in v0.0.2
Source
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
export type DataUnit =
| 'bit'
| 'B'
| 'KB'
| 'MB'
| 'GB'
| 'TB'
| 'PB'
| 'EB'
| 'ZB'
| 'YB'
Nullish
Nullish
类型表示值为 null
或 undefined
的类型。
Added in v0.0.4
Source
export type Nullish = undefined | null
SpreadSkipNullish
从左到右合并多个类型,形成一个新的对象类型。
前面对象中非 null
或 undefined
的字段不会被后面的 null
或 undefined
的字段覆盖。
Added in v0.0.4
Source
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
。 如果 T
是 any
,则结果为 true
,否则为 false
。
Added in v0.0.4
Source
export type IsAny<T> = 0 extends 1 & T ? true : false
ArrayIndexes
ArrayIndexes
类型用于获取数组中元素的索引(不包括数组的通用属性,如 length
)。
Added in v0.0.4
Source
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
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
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
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
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
export type IntersectionToObject<U> = {
[K in keyof UnionToIntersection<U>]: UnionToIntersection<U>[K]
}
FlattenNestObject
FlattenNestObject
类型用于将嵌套对象扁平化为新的对象类型。它通过 FlattenObject
将对象扁平化为联合类型,然后通过 UnionToIntersection
将联合类型转换为交叉类型,最终通过 IntersectionToObject
将交叉类型转换为对象类型。
Added in v0.0.4
Source
export type FlattenNestObject<T extends object> = IntersectionToObject<
UnionToIntersection<FlattenObject<T>>
>