类型推断增强
始于 1.6.0
高级类型推断工具。
概述
类型推断增强提供了高级类型推断工具,包括类型提取、重建、缩小、扩大和类型谓词。它支持通过正确的类型分析进行复杂的类型级编程。
此模块扩展了 TypeScript 的内置推断能力,提供更强大的类型操作工具。
基本用法
typescript
import type { Infer, InferReturn, InferArgs, IsAny, IsNever, Equals, TypeName } from 'uni-types'
// 推断 Promise 值
type PromiseValue = Infer<Promise<string>> // string
// 推断函数返回类型
type ReturnValue = InferReturn<() => number> // number
// 推断函数参数
type Args = InferArgs<(a: string, b: number) => void> // [string, number]
// 类型谓词
type CheckAny = IsAny<any> // true
type CheckNever = IsNever<never> // true
// 类型相等
type AreEqual = Equals<string, string> // true
// 类型名称
type Name = TypeName<number> // 'number'核心类型
Infer
从包装类型提取类型。
typescript
type Infer<T> = T extends Promise<infer U> ? U : TInferReturn
从函数提取返回类型。
typescript
type InferReturn<T extends (...args: unknown[]) => unknown> = T extends (...args: unknown[]) => infer R ? R : neverInferArgs
从函数提取参数类型。
typescript
type InferArgs<T extends (...args: unknown[]) => unknown> = T extends (...args: infer A) => unknown ? A : neverExtractFunction
从联合类型提取函数类型。
typescript
type ExtractFunction<T> = T extends (...args: unknown[]) => unknown ? T : neverExtractClass
从联合类型提取类类型。
typescript
type ExtractClass<T> = T extends abstract new (...args: unknown[]) => unknown ? T : neverReconstruct
重建具有推断属性的类型。
typescript
type Reconstruct<T> = T extends infer U ? { [K in keyof U]: U[K] } : neverNarrow
使用谓词缩小类型。
typescript
type Narrow<T> = T extends unknown ? (x: T) => T : neverWiden
将字面量类型扩大为原始类型。
typescript
type Widen<T> = T extends string ? string : T extends number ? number : T extends boolean ? boolean : T extends bigint ? bigint : TIsAny
检查类型是否为 any。
typescript
type IsAny<T> = 0 extends (1 & T) ? true : falseIsNever
检查类型是否为 never。
typescript
type IsNever<T> = [T] extends [never] ? true : falseIsUnknown
检查类型是否为 unknown。
typescript
type IsUnknown<T> = unknown extends T ? (T extends Record<string, never> ? false : true) : falseIsFunction
检查类型是否为函数。
typescript
type IsFunction<T> = T extends (...args: unknown[]) => unknown ? true : falseIsArray
检查类型是否为数组。
typescript
type IsArray<T> = T extends unknown[] ? true : falseIsUnion
检查类型是否为联合类型。
typescript
type IsUnion<T, U = T> = (T extends U ? (U extends T ? true : false) : false) extends true ? false : trueEquals
检查类型相等。
typescript
type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? true : falseTypeName
获取类型名称。
typescript
type TypeName<T> = T extends string ? 'string' : T extends number ? 'number' : T extends boolean ? 'boolean' : T extends undefined ? 'undefined' : T extends null ? 'null' : 'unknown'TypeCategory
获取类型类别。
typescript
type TypeCategory = 'primitive' | 'object' | 'array' | 'function' | 'union' | 'intersection' | 'tuple' | 'literal' | 'unknown'