我在下面创建了此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 })