如何判断泛型类型是否已声明?实现函数动态返回指定类型
解决方案
你可以通过泛型默认值+条件类型实现这个需求,让函数根据是否显式指定U类型返回对应结果:
修改后的代码
// 假设你已定义这些基础类型/枚举 export type LocalStorage = { searchTerm?: string; filters?: Record<string, any>; sortBy?: string; orderAsc?: boolean; }; export enum OrderMode { asc = 'asc', desc = 'desc' } export type PaginationOptions = { search?: string; orderMode?: OrderMode; orderBy?: string; filters?: Record<string, any>; }; export const localStorageToPaginationOptions = <T extends LocalStorage, U = never>( { searchTerm, filters, sortBy, orderAsc, ...props }: T & U ): U extends never ? PaginationOptions : U => ({ ...props, search: searchTerm, orderMode: orderAsc ? OrderMode.asc : OrderMode.desc, orderBy: sortBy, filters, } as U extends never ? PaginationOptions : U);
关键改动说明
- 给U设置默认类型:将
U的默认值设为never,调用函数时不指定U就会使用这个默认值。 - 条件类型控制返回值:用
U extends never ? PaginationOptions : U作为返回类型,实现分支逻辑:- 未指定
U时(即U为默认的never),返回PaginationOptions类型 - 显式指定
U的具体类型时,返回U类型
- 未指定
- 类型断言辅助推导:由于TypeScript编译器无法自动识别条件类型的返回结果,需要用
as断言匹配返回类型。
调用示例
// 场景1:不指定U,返回PaginationOptions类型 const basicResult = localStorageToPaginationOptions({ searchTerm: 'hello', orderAsc: false, filters: { status: 'active' } }); // 场景2:指定U类型,返回U类型 type CustomPaginateOptions = PaginationOptions & { page: number; pageSize: number }; const customResult = localStorageToPaginationOptions<LocalStorage, CustomPaginateOptions>({ searchTerm: 'world', orderAsc: true, page: 2, pageSize: 20 });
原代码的核心问题
你原来的返回类型PaginationOptions | U是联合类型,不管是否指定U都会同时包含两种类型,无法实现“二选一”的返回逻辑。条件类型则可以精准区分两种调用场景,返回对应的单一类型。
内容的提问来源于stack exchange,提问作者Adrien Servel
相关产品推荐
相关产品推荐

