typescript - 如何编写 TypeScript 可以通过推理返回 Map.get() 类型的返回值?
问题描述
type FuncType<O extends Object> = (option: O) => boolean
export const funcMap: Map<string, Function> = new Map()
const func1: FuncType<Object> = () => true
const func2: FuncType<{prop: number}> = ({ prop }) => prop !== 0
funcMap.set('func1', func1)
funcMap.set('func2', func2)
在其他文件中..
const _func2 = funcMap.get('func2')
if (_func2 !== undefined) _func2() // type is Function. I expect that FuncType<{prop: number}>
的类型_func2()
是函数。
我明白为什么会这样。
如何编写 TypeScript 可以通过推理返回 Map.get() 类型的返回值?
解决方案
您可以扩展原始Map
接口,重载其.get()
方法以将类型字典“注入”到其中。
type FuncType<O extends Object> = (option: O) => boolean
const func1: FuncType<Object> = () => true
const func2: FuncType<{prop: number}> = ({ prop }) => prop !== 0
export const funcMap: MyMap<keyof MyMapStore, Function> = new Map()
funcMap.set('func1', func1)
funcMap.set('func2', func2)
interface MyMapStore {
func1: typeof func1
func2: typeof func2
}
interface MyMap<K, V> extends Map<K, V> {
get<P extends keyof MyMapStore>(key: P): MyMapStore[P]
get(key: K): V
}
// ----- other file ----
import { funcMap } from './somewhere'
const _func1 = funcMap.get('func1')
const _func2 = funcMap.get('func2')
推荐阅读
- shell - 更改固定格式文件中的选定列
- c# - 为什么我不能覆盖 hibernate.cfg.xml 中的配置
- kubernetes - Kubernetes cron 作业需要从 prod 而不是最新的获取标签?
- http - HTTP 标头是否对空格/大小写/顺序敏感?
- c# - 从模板部署和运行 bot 框架 v4.4+ 有效,但使用 fork 和源代码控制部署和运行不起作用
- terraform - Terraform 拒绝 JSON 模板文件
- python - 对象之间的Tkinter碰撞?
- java - Java Applet Pong 游戏 if 语句不停止
- prometheus - 如何重新标记 consul sd 配置以获取基于 consul 元数据的服务发现统计信息?
- html - 如何通过边框内的所有链接和粗体标记段落的某些文本