typescript - 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 */}
解决方案
可以使用映射类型和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
始终是所声明的类型;并且这种类型(本质上是所有可能的函数名的联合)成为返回值的索引类型。
推荐阅读
- android - 如何在android Kotlin中将对象从一个活动传递到另一个活动?
- wordpress - Divi Builder 未加载保存的布局
- python - Python Flask Docker 迁移
- virtualbox - 鼠标按预期移动,但无法选择或单击(最近更新后)[Arch Linux on Virtualbox]
- c++ - 将 std::string 转换为 const tchar*
- elasticsearch - Elasticsearch 查询循环返回不同的结果
- datatables - Jquery Datatables复选框记住分页问题
- wordpress - 根据星期几插入文本的简码
- python - 让 SublimeLinter 显示错误代码
- python - 使用scrapy-splash点击按钮