我正在尝试创建一个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是一个吸气剂,没有可用的解析器,因此没有任何推断。
如果装饰者存在,设置者只会抛出