TypeScript将映射交集类型转换为重载

时间:2018-12-23 20:38:09

标签: typescript

我有一个类型,它是表示方法签名列表的类型的交集:

type query =
    | ((query: getAuthorizationState) => AuthorizationState)
    | ((query: setTdlibParameters) => Ok)
    | ((query: checkDatabaseEncryptionKey) => Ok)
    | ((query: setAuthenticationPhoneNumber) => Ok)
    | ((query: resendAuthenticationCode) => Ok)
    | ((query: checkAuthenticationCode) => Ok)
    | ((query: checkAuthenticationPassword) => Ok)
    | ((query: requestAuthenticationPasswordRecovery) => Ok)
    | ((query: recoverAuthenticationPassword) => Ok)
    | ((query: checkAuthenticationBotToken) => Ok)
    | ((query: logOut) => Ok)
    | ((query: close) => Ok)
    | ((query: destroy) => Ok)
// ...

此操作持续301行,旨在用作参数和结果之间的映射。然后,我创建了一系列执行某些体操运动的类型,以转换query类型:

type ParamDistribute<T> = T extends (q: infer U) => infer V ? U : never;
type ReturnDistribute<T> = T extends (q: infer U) => infer V ? V : never;
type QueryDistribute<T> = T extends (q: infer U) => infer V ? (q: U) => V | error | null : never;
type PromiseDistribute<T> = T extends (q: infer U) => infer V ? (q: U) => Promise<V> : never;
type FutureDistribute<T> = T extends (q: infer U) => infer V ? (q: U) => Future<Error, V> : never;

export type Query = ParamDistribute<query>;
export type QueryResult = ReturnDistribute<query>;
export type QueryFunc = QueryDistribute<query>;
export type QueryFuncPromise = PromiseDistribute<query>;
export type QueryFuncFuture = FutureDistribute<query>;

QueryFuncquery相同,除了所有返回类型都与error(不是Error,而是我拥有的自定义接口)相交{1}}。 nullQueryFuncPromise相同,除了所有的返回类型都是promise等。

现在,我有一个具有可实现此类型签名的功能的类。我尝试通过接口应用query类型,并使该函数通用:

query

但是,当我尝试使用该方法时,我仍然没有获得正确的类型验证:

enter image description here

interface TDClientFunctions { query: TDL.QueryFuncFuture; } export class TDClient extends EventEmitter implements TDClientFunctions { // ... public query<T extends TDL.Query, V extends TDL.QueryResult>(query: T): Fluture.FutureInstance<TDL.error, V> { // ... } } 交集中只有一个接口适合我传递的参数:

query

那为什么返回类型不能解析为export type testCallEmpty = { _: "testCallEmpty", } // ... type query = // ... | ((query: testCallEmpty) => Ok) // ... ?为什么不能正确推断类型参数Ok

换句话说,我试图提供函数重载签名而不实际将它们写为重载,因为它们有300个,而且我的班级将有不止一种遵循这种模式的方法(因此{{1} },VQueryFunc等)。在TypeScript中可以吗?

0 个答案:

没有答案