一个类型装饰器如何正确推断类型?

时间:2017-05-05 14:42:19

标签: typescript this decorator type-inference union-types

基本上我有这个功能:

function portable(func) {
    return function(...args) {
        if (typeof this === undefined) {
            return func(...args)
        } else {
            return func(this, ...args)
        }
    }
}

我想为它添加类型,例如这个函数的类型:

const add = portable((x: number, y: number): number => x + y)

可以正确推断为这两种类型的并集:

(this: undefined, x: number, y: number) => number
(this: number, y: number) => number

我在类型系统中问的可能吗?如果是这样,任何人都可以提出表达这种类型的方式吗?

1 个答案:

答案 0 :(得分:0)

基于我发现this issue几个小时的研究,我认为目前这是不可能的。

有效地,即使参数已知,也似乎无法捕获函数参数的类型,实际上我无法以任何可能的方式表示:

function addUselessArg(func) {
    return function(first: 'Banana', ...args) {
        return func(...args)
    }
}

很明显,addUselessArg((x: number) => x**2)的类型是(first: 'Banana', x: number) => number,但如果不能将变量参数args的类型指定为{的类型,那么似乎无法实现{1}}的论点。