Typescript从“ ./foo”获取“ import * as whatIsMyType;”的类型;

时间:2018-09-10 15:06:47

标签: typescript

我的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 */}

1 个答案:

答案 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的元素始终是所声明的类型;并且此类型(基本上是所有可能的函数名称的并集)成为返回值的索引类型。