繁体   English   中英

是否可以在 typescript 的映射类型中推断函数的返回类型?

[英]Is it possible to infer return type of functions in mapped types in typescript?

我想要 map object 的函数到另一个 object 的函数与函数类型推断。 function 的 Arguments 推断但函数结果是any

type TOriginalFunction<TArg,TResponse> = (prefix: string, arg: TArg) => TResponse;

type TModifiedFunction<TArg,TResponse> = (arg: TArg) => TResponse;

function modify<TArg, TResponse>(
  func: TOriginalFunction<TArg, TResponse>
): TModifiedFunction<TArg, TResponse> {
  return (arg:TArg) => func("", arg);
}

type TSourceObject<T> = 
  {[K in keyof T]: TOriginalFunction<T[K], any>};

type TModifiedObject<T> =
  {[K in keyof T]: TModifiedFunction<T[K], any>};

function modifyAll<T>(obj: TSourceObject<T>): TModifiedObject<T> {
    const result: Partial<TModifiedObject<T>> = {};
    for (const key of Object.keys(obj) as (keyof T)[]) {
        const fetchifiedFunc = modify(obj[key]);
        result[key] = fetchifiedFunc;
    }
    return result as TModifiedObject<T>;
}

var f1:TOriginalFunction<string,string> = () => "";
var f2:TOriginalFunction<void,boolean> = () => false;

const ff=modifyAll({f1,f2});
const f1res=ff.f1(''); // wanna typeof f1res to be string
const f2res=ff.f2(); // wanna typeof f2res to be boolean

试过了

type TOriginalFunction<TArg,TResponse> = (prefix: string, arg: TArg) => TResponse;

type TModifiedFunction<TArg,TResponse> = (arg: TArg) => TResponse;

function modify<TArg, TResponse>(
  func: TOriginalFunction<TArg, TResponse>
): TModifiedFunction<TArg, TResponse> {
  return (arg:TArg) => func("", arg);
}

type TSourceObject<T extends {[key: string]:{arg:any,result:any}}> = 
  {[K in keyof T]: TOriginalFunction<T[K]['arg'], T[K]['result']>};

type TModifiedObject<T extends {[key: string]:{arg:any,result:any}}> =
  {[K in keyof T]: TModifiedFunction<T[K]['arg'], T[K]['result']>};

function modifyAll<T extends {[key: string]:{arg:any,result:any}}>(obj: TSourceObject<T>): TModifiedObject<T> {
    const result: Partial<TModifiedObject<T>> = {};
    for (const key of Object.keys(obj) as (keyof T)[]) {
        const fetchifiedFunc = modify(obj[key]);
        result[key] = fetchifiedFunc;
    }
    return result as TModifiedObject<T>;
}

var f1:TOriginalFunction<string, string> = () => "";
var f2:TOriginalFunction<void, boolean> = () => false;

const ff=modifyAll({f1,f2});
const f1res=ff.f1(''); // wanna typeof f1res to be string
const f2res=ff.f2(); // wanna typeof f2res to be boolean

但现在一切都any了。 我做错了什么?

通过在modifyAll上使用泛型T来描述原始 object,并从原始 object 映射到修改版本,我得到了您想要的返回类型。

function modifyAll<T extends {[key: string]: TOriginalFunction<any, any>}>(obj: T): TModifiedObject<T> {....
type TModifiedObject<T> = {
    [K in keyof T]: T[K] extends TOriginalFunction<infer Arg, infer Res> ? TModifiedFunction<Arg, Res> : never;
};

这为所有返回值提供了清晰的类型,但它在 function 实现中引入了一个新错误。 T的 object 值都extend TOriginalFunction<any, any> ,但 function 主体不知道具体类型。 所以我不得不用

result[key] = fetchifiedFunc as TModifiedObject<T>[keyof T];

Typescript 游乐场链接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM