Typescript 动态地将函数放入对象而不丢失类型信息
在my functions.ts中,我定义了两个函数,它们都接受一个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 {/*
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');
在这里,它在房间里。很好!你能修好操场连接吗?我会修好操场连接的。