Сделать интерфейс функции асинхронным без копирования и вставки - PullRequest
0 голосов
/ 26 марта 2019

Webpack предоставляет интерфейс TypeScript для реализации загрузчика:

import { loader } from "webpack";

namespace loader {
  interface Loader extends Function {
      (this: LoaderContext, source: string | Buffer, sourceMap?: RawSourceMap): string | Buffer | void | undefined;
      pitch?(remainingRequest: string, precedingRequest: string, data: any): any;
      raw?: boolean;
  }
}

Поэтому, когда я реализую это, я делаю

const sfcLoader: loader.Loader = function(source: string) {
  /* ... */
};

Теперь я пытаюсь создать интерфейс, который является интерфейсом , но возвращает обещание:

const sfcLoader /* : loader.Loader */ = async function(source: string) {
  /* await ... */
};

Обратите внимание, что async

Конечно, я не хочу копировать и вставлять этот интерфейс,Есть ли способ, которым я могу расширить (или что-то) и изменить интерфейс из веб-пакета?

1 Ответ

0 голосов
/ 26 марта 2019

Вам необходимо создать сопоставленный тип на основе интерфейса вашего загрузчика.Идея состоит в том, что вам нужно использовать ключевое слово infer, чтобы получить доступ к существующему типу возвращаемого значения функции.В вашем случае, вам нужно заключить возвращаемый тип в Promise, я думаю.Попробуйте этот пример кода в TypeScript Playground (мы написали его для книги «TypeScript Quickly»):

type ReturnPromise<T> =
    T extends (...args: infer A) => infer R ? (...args: A) => Promise<R> : T;   

type Promisify<T> = {
    [P in keyof T]: ReturnPromise<T[P]>;
};

interface SyncService {
    baseUrl: string; 
    getA(): string;
}

class AsyncService implements Promisify<SyncService> {
    baseUrl: string; 

    getA(): Promise<string> {
        return Promise.resolve('');
    }
}

let service = new AsyncService();


let result = service.getA(); // hover over result: it's of type Promise<string>

Здесь мы объявляем новый тип Promisify<T>.Чтобы проверить это, мы берем интерфейс SyncService, находим его свойства, которые являются методами (в данном случае getA()), и переносим его тип возвращаемого значения в Promise.

...