我有一个类型,它是表示方法签名列表的类型的交集:
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>;
QueryFunc
与query
相同,除了所有返回类型都与error
(不是Error
,而是我拥有的自定义接口)相交{1}}。 null
与QueryFuncPromise
相同,除了所有的返回类型都是promise等。
现在,我有一个具有可实现此类型签名的功能的类。我尝试通过接口应用query
类型,并使该函数通用:
query
但是,当我尝试使用该方法时,我仍然没有获得正确的类型验证:
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} },V
,QueryFunc
等)。在TypeScript中可以吗?