type MethodSignature< Name extends string = string, Params extends unknown[] = unknown[], Result = unknown, > = { name: Name; params: Params; result: Result; }; export type Method = (...args: never[]) => unknown; export type API = Record; type Names = keyof T & string; type MethodSignatureForKey> = MethodSignature< K, Parameters, ReturnType >; // ProxyMehod export type ProxyMethod = ( method: T["name"], ...params: T["params"] ) => T["result"]; type ProxyMethodForKey> = ProxyMethod< MethodSignatureForKey >; export type ProxyMethodFor = { [K in Names]: ProxyMethodForKey; }[Names]; // Payload type Payload = { method: T["name"]; params: T["params"]; }; export type PayloadForKey> = Payload< MethodSignatureForKey >; // Request export type IframeProxyMessageEvent = { type: T; requestId: string; }; export type RequestForKey< A extends API, K extends Names, > = IframeProxyMessageEvent<"UIExtensionRequest"> & { payload: PayloadForKey; }; export type RequestFor = { [K in Names]: RequestForKey; }[Names]; // Response export type Response = IframeProxyMessageEvent<"UIExtensionResponse"> & { payload: T; };