![](/img/trans.png)
[英]TypeScript: Infer specific types of arguments and return values of functions in a mapped object
[英]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];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.