【问题标题】:How can one type decorators to correctly infer types?一种类型的装饰器如何正确推断类型?
【发布时间】:2017-05-05 14:42:18
【问题描述】:

基本上我有这个功能:

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

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

【问题讨论】:

  • 我不确定这是否符合您的想法。 func 将始终在将 this 设置为 undefined 的情况下调用。
  • 你为什么想要一个工会?重载声明似乎更符合人体工程学。
  • 重载和联合有什么区别?就像(x) => typeof x === 'number' ? x : 'foo' 的类型本质上不是(x: number) => number(x: any) => string 的联合吗?
  • Mike 就是这个想法,装饰的 func 不使用它,但装饰器返回的函数使用,我指的类型是装饰 func 的类型,但 (x: number, y: number) => number 是未修饰函数的类型,但是如果我将其附加到对象并将其作为方法调用,则可移植返回的函数可以具有未定义的 this。

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


【解决方案1】:

根据我发现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 的参数类型,这似乎是不可能的。

【讨论】:

    猜你喜欢
    • 2023-03-30
    • 1970-01-01
    • 2018-08-02
    • 1970-01-01
    • 2012-02-29
    • 2016-07-23
    • 2014-04-08
    • 2020-01-17
    • 1970-01-01
    相关资源
    最近更新 更多