首页 > 解决方案 > Typescript 获取“import * as whatIsMyType from './foo';”的类型

问题描述

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

标签: typescript

解决方案


可以使用映射类型和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始终是所声明的类型;并且这种类型(本质上是所有可能的函数名的联合)成为返回值的索引类型。


推荐阅读