diff --git a/src/Trait.ts b/src/Trait.ts index 75d859e..cffd410 100644 --- a/src/Trait.ts +++ b/src/Trait.ts @@ -39,42 +39,52 @@ export class Trait< ) {} } -export interface TraitOwnAbstractFn extends Fn { - return: this["arg0"] extends Trait +export type TraitOwnAbstract = ( + T extends Trait ? Abstract : never +) +export interface TraitOwnAbstractFn extends Fn { + return: TraitOwnAbstract } -export type TraitOwnAbstract = Call -export interface TraitOwnImplClassFn extends Fn { - return: this["arg0"] extends Trait +export type TraitOwnImplClass = ( + T extends Trait ? ImplClass : never +) +export interface TraitOwnImplClassFn extends Fn { + return: TraitOwnImplClass } -export type TraitOwnImplClass = Call -export interface TraitOwnImplInstanceFn extends Fn { - return: this["arg0"] extends Trait +export type TraitOwnImplInstance = ( + T extends Trait ? InstanceType : never +) +export interface TraitOwnImplInstanceFn extends Fn { + return: TraitOwnImplInstance } -export type TraitOwnImplInstance = Call -export interface TraitOwnClassFn extends Fn { - return: this["arg0"] extends Trait +export type TraitOwnClass = ( + T extends Trait ? AddAbstractToImplClass : never +) +export interface TraitOwnClassFn extends Fn { + return: TraitOwnClass } -export type TraitOwnClass = Call -export interface TraitOwnInstanceFn extends Fn { - return: this["arg0"] extends Trait +export type TraitOwnInstance = ( + T extends Trait ? InstanceType< AddAbstractToImplClass > : never +) +export interface TraitOwnInstanceFn extends Fn { + return: TraitOwnInstance } -export type TraitOwnInstance = Call export interface TraitSupertraitsFn extends Fn {