无法获取Typescript方法修饰器来推断参数类型

时间:2019-06-05 09:41:28

标签: typescript decorator

我正在尝试创建一个Memoize装饰器,并且我模仿lodash的memoize函数,但作为装饰器。我在让TypeScript来为resolver函数推断参数时遇到困难。

export function Memoize<T extends any[], C>(resolver?: (...args: T) => C) { 
    return function <D>(target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(...args: T) => D>) { 
        const original = descriptor.value;

        if (!original) { 
            throw new Error(`Can't be undefined!`);
        }

        descriptor.value = function (...args: T): D {
            const key: C = resolver ? resolver.apply(this, args) : args[0];
            const result: D = original.apply(this, args);

            console.log(key);

            return result;
        };

        return descriptor;
    }
}

class Test {
    @Memoize(t => t)
    public test(test: string): string { 
        return test;
    }
}

传递给备忘录的回调被推断为:<[any], any>,但我希望将其推断为:[string], string

例如:

class Test {
   @Memoize(test => test)
   public test1(value: string): string {
      return value;
   }

   @Memoize(test => test)
   public test2(value: string): Observable<string> {
      return of(value);
   }

   @Memoize(test => test.test)
   public test3(value: { test: string }): Observable<{ test: string }> {
      return of(value);
   }

   @Memoize()
   public get test4(): string {
       return '123';
   }
}

回调已传递到我想推断类型的Memoize装饰器中。

因此对于测试1,test在参数和return中均为字符串。 对于测试2,同样的东西,参数和return均为字符串。 测试3,参数为{ test: string },返回值为字符串。 测试4是一个吸气剂,没有可用的解析器,因此没有任何推断。

如果装饰者存在,设置者只会抛出

0 个答案:

没有答案