Я собираюсь взять интерфейсы, подобные этому:
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) .. Есть ли способ сохранить обобщения функции через сопоставление типов?
соответствующие материалы для чтения: