首页 > 解决方案 > 如何编写 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() 类型的返回值?

标签: typescript

解决方案


您可以扩展原始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')

推荐阅读