如何根据提供的功能动态添加返回类型

时间:2019-11-01 20:53:43

标签: typescript

我在下面创建了此overload函数。它接受一个键对象,并根据可用的参数属性选择要执行的函数。

以下代码在功能上起作用。问题是打字稿。包装这些函数意味着打字稿不知道返回值是什么。

例如,我添加了exampleGetNumb,它返回一个数字。

理想情况下,所有返回值都是可能的。如果它们都返回相同的类型,则创建的函数将知道,它将返回该类型。

是否可以向此overload函数添加正确的返回类型?

interface OverLoadCoreOption {
    props: string[],
    fn: any
}

interface OverLoadPropOption {
    [key: string]: any
}

type OverLoadOption = OverLoadPropOption | OverLoadCoreOption

const overloadCore = (options: OverLoadCoreOption[], input) => {
    const match = _.find(options, (option) => _.intersection(option.props, Object.keys(input)).length == option.props.length)
    if (!match) throw new Error('No matching overload function')
    console.log(match)
    return match.fn(input)
}

const getOverloadProps = (options: OverLoadOption[]): OverLoadCoreOption[] => {
    const r = options.map((option: OverLoadOption) => {
        if (option.props && option.fn) return { props: option.props, fn: option.fn }
        return _.map(option, (fn, key) => ({ props: [key], fn }))
    })
    return _.flatten(r)
}

const overload = (...options: OverLoadOption[]) => {
    const props = getOverloadProps(options)
    console.log(props)
    return (input) => {
        return overloadCore(props, input)
    }
}

const exampleGetNumb = (): number => 1

const getColor = overload({
    'black': () => 'a',
    'red': () => exampleGetNumb(),
}, {
   green: () => 'c' 
}, {
    props: ['purple'],
    fn: () => 'f'
})

const color = getColor({ purple: true })

0 个答案:

没有答案