Тип, который преобразует все методы интерфейса для возврата обещаний - PullRequest
0 голосов
/ 22 апреля 2020

Если у меня есть такой интерфейс, как

interface foo {
  bar(): string
}

Я бы хотел, чтобы тип утилиты преобразовывал все свои методы для возврата обещаний

type bar = Promised<foo>

/*
interface bar {
  bar(): Promise<string>
}
*/

Я начал на нем, и я получили это далеко:

export type PromisesMap<T> = { [P in keyof T]: Promise<T[P]> };

Но он преобразует свойства в обещания, а не возвращаемые типы

1 Ответ

1 голос
/ 22 апреля 2020

Здесь вы go:

interface Foo {
  bar(): string
}

type Promisify<T> = {
  [K in keyof T]: T[K] extends (...args: any) => any
    ? (...args: Parameters<T[K]>) => Promise<ReturnType<T[K]>>
    : T[K]
};

type FooWithPromises = Promisify<Foo>; // { bar: () => Promise<string>; }

Детская площадка


Мы используем сопоставленный тип (как вы уже начал делать). Мы проверяем, является ли член функцией, и если да, возвращаем функцию с теми же аргументами и возвращаемым типом, заключенным в Promise, в противном случае сохраняем тип члена ( условный тип ). Для извлечения параметров функций и типов возврата мы используем Параметры и ReturnType утилиты.


Выполнение дополнительного шага в соответствии с предложением @VLAZ и пропуск методов, которые уже возвращают Promise:

interface Foo {
  bar(): string,
  baz(arg: string): Promise<boolean>,
}

type WrapNonPromiseInPromise<T> = T extends Promise<any> ? T : Promise<T>;

type Promisify<T> = {
  [K in keyof T]: T[K] extends (...args: any) => any
  ? (...args: Parameters<T[K]>) => WrapNonPromiseInPromise<ReturnType<T[K]>>
  : T[K]
};

type FooWithPromises = Promisify<Foo>; // { bar: () => Promise<string>, baz: (arg: string) => Promise<boolean> }

Детская площадка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...