Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 动态地将函数放入对象而不丢失类型信息_Typescript_Types - Fatal编程技术网

Typescript 动态地将函数放入对象而不丢失类型信息

Typescript 动态地将函数放入对象而不丢失类型信息,typescript,types,Typescript,Types,在my functions.ts中,我定义了两个函数,它们都接受一个api对象,并返回一个具有不同参数类型、参数编号和返回类型的函数 export function f1 (api: Api) { return function (a: number): number[] {/* not important */} }; export function f2 (api: Api) { return function (a: string, b: string): boolean {/*

在my functions.ts中,我定义了两个函数,它们都接受一个
api
对象,并返回一个具有不同参数类型、参数编号和返回类型的函数

export function f1 (api: Api) {
  return function (a: number): number[] {/* not important */}
};
export function f2 (api: Api) {
  return function (a: string, b: string): boolean {/* not important */}
};
现在给定一个
api:api
全局对象,我想定义一个对象,该对象具有字段
f1
f2
,与每个字段关联的值是上述两个函数中的内部函数

也就是说,我会手动执行以下操作:

const api: Api = ...;
const myObject = {
  f1: f1(api),
  f2: f2(api),
}
这非常有效

但是下一步:我希望动态地执行它,即不需要手动键入f1和f2

这是我的开始:

import * as functions from './functions';

const api: Api = ...;
const myObject = Object.keys(functions).reduce((accumulator, functionName) => {
  accumulator[functionName] = functions[functionName](api);
}, {} as ???);
代码是有效的,但打字是无效的。我不知道该放什么来代替
<代码>{[index:keyof typeof functions]:(…args:any[])=>any}可以工作,但是我丢失了很多关于类型的信息

我试着查看TS的
参数
返回类型
,我确信可以用
推断
做些什么,但似乎无法掌握它

代码是有效的,但打字是无效的。我不知道该放什么来代替

这里有一个有效的方法。它创建一个新类型,将每个函数名映射到其返回类型

type ReturnTypes<T> = {
    [K in keyof T]: T[K] extends (...args: any) => any
    ? ReturnType<T[K]>
    : never;
};

const myObject = Object
    .keys(functions)
    .reduce(
        (accumulator, functionName) => {
            accumulator[functionName] = functions[functionName](api);
            return accumulator;
        },
        {} as ReturnTypes<typeof functions>
    );

const result1: number[] = myObject.f1(10);
const result2: boolean = myObject.f2('foo', 'bar');
类型返回类型={
[K in keyof T]:T[K]扩展(…args:any)=>any
?返回式
:从不;
};
常量myObject=对象
.钥匙(功能)
.减少(
(累加器,函数名)=>{
累加器[functionName]=函数[functionName](api);
回流蓄能器;
},
{}作为返回类型
);
const result1:number[]=myObject.f1(10);
constresult2:boolean=myObject.f2('foo','bar');

在这里,它在房间里。

很好!你能修好操场连接吗?我会修好操场连接的。