typescript 如何检查是否定义了泛型类型

czq61nw1  于 2022-11-18  发布在  TypeScript
关注(0)|答案(1)|浏览(121)

我有一些效用函数看起来像这样:

export const localStorageToPaginationOptions = <T extends LocalStorage, U>({
  searchTerm,
  filters,
  sortBy,
  orderAsc,
  ...props
}: T & U): PaginationOptions | U => ({
    ...props,
    search: searchTerm,
    orderMode: orderAsc ? OrderMode.asc : OrderMode.desc,
    orderBy: sortBy,
    filters,
  });

我希望函数返回PaginationOptions类型或者U类型,如果它已经在函数调用中声明了的话。有没有办法做到这一点?

zpqajqem

zpqajqem1#

您可以使用条件返回类型来检查unkown是否扩展了U。请注意,您将需要返回值的类型Assert,因为TypeScript通常无法理解具有泛型返回类型的函数的实现。

export const localStorageToPaginationOptions = <T extends LocalStorage, U>({
  searchTerm,
  filters,
  sortBy,
  orderAsc,
  ...props
}: T & U): unknown extends U ? PaginationOptions : U => ({
    /* ... props ... */ 
  } as unknown extends U ? PaginationOptions : U);

这会在呼叫时产生下列行为:

const a = localStorageToPaginationOptions({})
// const a: PaginationOptions

const b = localStorageToPaginationOptions<LocalStorage, { something: "for U" }>({})
// const b: {
//    something: "for U";
// }

Playground

相关问题