假设我正在处理与以下接口相对应的对象:
interface Foo {
getCount(): number;
doSomething(): boolean;
}
它只有函数,并且没有一个函数是异步的。但是,我并不总是能够同步访问该对象,并且在某些情况下将处理异步版本,其中所有函数返回值都包装在 Promises 中。就像这样:
interface AsyncFoo {
getCount(): Promise<number>;
doSomething(): Promise<boolean>;
}
我正在尝试创建一个 Typescript 映射类型来表示这种转换,因为我有大量的对象接口,并且不想简单地复制每个接口并最终得到两个接口interface [name]
and interface Async[name]
并且所有方法原型都是重复的。
我的第一个想法是也许我可以像这样修改接口:
type Self<T> = T;
interface Foo<S = Self> {
getCount(): S<number>;
doSomething(): S<boolean;
}
type AsyncFoo = Foo<Promise>;
但两者Self
and Promise
要求在使用泛型时静态给出它们,而不是能够以这种向后的方式使用它们。
接下来我尝试创建某种映射类型,例如:
type Promisify<T> = {[K in keyof T]: Promise<T[K]>}
当然,这将接口的每个完整方法包装在 Promise 中,而不仅仅是返回值,给我:
type PromisifiedFoo = {
getCount: Promise<() => number>;
doSomething: Promise<() => boolean>;
}
我尝试通过使用通用范围来扩展这一点T
of Promisify
like:
type Promisify<T extends {[key: string]: <S>() => S}> = ...
但我似乎无法将它们整合在一起。
所以现在我在这里。有什么方法可以让我构建一个类型(映射或其他方式)来表示这种“Promisify”转换到类型的返回值上?