我的foo.ts
导出具有相同签名的多个函数,例如(a: number): number
。
在我的main.ts中,
import * as foo from './foo';
// foo.myFunction1 and foo.myFunction2 are defined
export const resultsFor = (a: number) => {
return Object.keys(foo).reduce(
(result, currentKey) => {
result[currentKey] = foo[currentKey](a);
return result;
},
{} as {[index:string]: number}
);
}
现在resultFor
的类型为(a: number): {[index:string]: number}
,但这有点太笼统了。
我希望resultFor
的类型为
(a: number): {myFunction1: number, myFunction2: number, /* and other exports from 'foo.ts': number */}
答案 0 :(得分:1)
可以处理映射类型和keyof
。请考虑以下内容:
type fooKey = keyof typeof foo;
export const resultsFor = (a: number) => {
return Object.keys(foo).reduce(
(result, currentKey) => {
result[currentKey as fooKey] = foo[currentKey as fooKey](a);
return result;
},
{} as {[index in fooKey]: number}
);
}
在这里,我们使用显式类型声明,因为我们知道Object.keys
的元素始终是所声明的类型;并且此类型(基本上是所有可能的函数名称的并集)成为返回值的索引类型。