一种类型装饰器如何正确推断类型?
How can one type decorators to correctly infer 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
在类型系统中我问的是可能的吗?如果可以的话,谁能给出一种表达这种类型的方法?
根据我发现 this issue.
的几个小时的研究,我认为目前这是不可能的
实际上似乎无法捕获函数参数的类型,即使参数是已知的,实际上我无法以任何可以想象的方式表示这一点:
function addUselessArg(func) {
return function(first: 'Banana', ...args) {
return func(...args)
}
}
很明显 addUselessArg((x: number) => x**2)
的类型是 (first: 'Banana', x: number) => number
但是如果不能指定可变参数的类型 args
似乎是不可能的func
的论点。
基本上我有这个功能:
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
在类型系统中我问的是可能的吗?如果可以的话,谁能给出一种表达这种类型的方法?
根据我发现 this issue.
的几个小时的研究,我认为目前这是不可能的实际上似乎无法捕获函数参数的类型,即使参数是已知的,实际上我无法以任何可以想象的方式表示这一点:
function addUselessArg(func) {
return function(first: 'Banana', ...args) {
return func(...args)
}
}
很明显 addUselessArg((x: number) => x**2)
的类型是 (first: 'Banana', x: number) => number
但是如果不能指定可变参数的类型 args
似乎是不可能的func
的论点。