我想创建一个辅助类+装饰器来跟踪函数调用的状态。我创建了一个装饰器,该装饰器可用于任何可能执行不重要操作的类函数,这些操作会更新类的参数以跟踪该函数的状态。我要输入上述参数的对象。
使用一些examples,我想到了几乎可以带我到那里的东西(部分显示):
nil
在课程中检查nil
时,我得到一个没有有效键的空对象。
我认为我想做的事情最终会以某种周期性关系结束-我将Class作为通用参数传递给它在定义类时所扩展的内容。
是否有一种方法可以将type KeysOfType<T, TProp> = { [P in keyof T]: T[P] extends TProp ? P : never }[keyof T];
type FunctionKeys<T> = Exclude<KeysOfType<T, (...args: any[]) => Promise<any>>, keyof StateTracking<object>>;
interface StateTracking<T> {
errors: { [key in FunctionKeys<T>]?: Error | boolean };
}
abstract class StateTrackingImpl<T> implements StateTracking<T> {
public errors: { [key in FunctionKeys<T>]?: Error | boolean } = {};
}
type AsyncStateDecorator = <T extends StateTracking<T>, R>(
target: T,
key: FunctionKeys<T>,
descriptor: TypedPropertyDescriptor<(...args: any[]) => Promise<R>>,
) => TypedPropertyDescriptor<(...args: any[]) => Promise<R>>;
const AsyncState: AsyncStateDecorator = ... // Implementation omitted
let v: FunctionKeys<Component> = 'test'; // Works as expected
v = 'wont work'; // Gives me an error - good!
class Component extends StateTrackingImpl<Component> {
@AsyncState
public async test() {
// this.errors is typed as { [x: string]: Error | boolean } and is of value {}
return;
}
}
初始化为空对象以外的任何东西?我的目标甚至有可能吗?