将类变量的属性键入为类的函数名称

时间:2019-08-14 11:49:54

标签: typescript generics

我想创建一个辅助类+装饰器来跟踪函数调用的状态。我创建了一个装饰器,该装饰器可用于任何可能执行不重要操作的类函数,这些操作会更新类的参数以跟踪该函数的状态。我要输入上述参数的对象。

使用一些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; } } 初始化为空对象以外的任何东西?我的目标甚至有可能吗?

0 个答案:

没有答案