TypeScript сопоставление типов: как обернуть возвращаемые значения функции? - PullRequest
0 голосов
/ 19 мая 2018

Я собираюсь взять интерфейсы, подобные этому:

interface Store {
  test1(): void
  test2(a: string, b: number): RegExp
  test3<T>(a: string, b: number): Promise<T>
}

и используя сопоставленный тип, такой как
type AsyncStore = Asyncd<Store>
, я хотел бы пообещать завершение функции returnзначения:

type AsyncStore = Asyncd<Store>
  // {
  //   test1(): Promise<void>
  //   test2(a: string, b: number): Promise<RegExp>
  //   test3<T>(a: string, b: number): Promise<T>
  // }

мне нужно улучшение по сравнению с этим типом "Asyncd", который я сделал:

type AnyFunc = (...args: any[]) => any

// wraps a type in a promise, unless it's already a promise
type PromiseWrap<T> = T extends Promise<any> ? T : Promise<T>

// wrap a function's return type in a promise
type PromiseWrapResult<Func extends AnyFunc> =
  ReturnType<Func> extends Promise<any>
    ? (...args: any[]) => ReturnType<Func>
    : (...args: any[]) => Promise<ReturnType<Func>>

// perform promise wrapping for each function
type Asyncd<Subject> = {
  [Prop in keyof Subject]: Subject[Prop] extends AnyFunc
    ? (...args: any[]) => PromiseWrap<ReturnType<Subject[Prop]>>
    : Subject[Prop]
}

interface MyStore {
  test1(): void
  test2(a: string, b: number): RegExp
  test3<T>(a: string, b: number): Promise<T>
}

type MyAsyncStore = Asyncd<MyStore>
  // {
  //   test1(...args: any[]): Promise<void>
  //   test2(...args: any[]): Promise<RegExp>
  //   test3(...args: any[]): Promise<{}>
  // }

почти там, но не совсем - чего не хватает:

  • все аргументы функции теряются, становясь ...args: any[]
  • Обобщения не выживают при преобразовании (обратите внимание на test3) .. Есть ли способ сохранить обобщения функции через сопоставление типов?

соответствующие материалы для чтения:

...