You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判断泛型类型是否已声明?实现函数动态返回指定类型

解决方案

你可以通过泛型默认值+条件类型实现这个需求,让函数根据是否显式指定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);

关键改动说明

  1. 给U设置默认类型:将U的默认值设为never,调用函数时不指定U就会使用这个默认值。
  2. 条件类型控制返回值:用U extends never ? PaginationOptions : U作为返回类型,实现分支逻辑:
    • 未指定U时(即U为默认的never),返回PaginationOptions类型
    • 显式指定U的具体类型时,返回U类型
  3. 类型断言辅助推导:由于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 20:05:32