diff --git a/projects/s-js-utils/src/lib/callable-object.spec.ts b/projects/s-js-utils/src/lib/callable-object.spec.ts index 8e9b2a8..2b4abbe 100644 --- a/projects/s-js-utils/src/lib/callable-object.spec.ts +++ b/projects/s-js-utils/src/lib/callable-object.spec.ts @@ -1,11 +1,6 @@ import { CallableObject } from "./callable-object"; -interface Multiplier { - // tslint:disable:callable-types - (value: number): number; -} - -class Multiplier extends CallableObject { +class Multiplier extends CallableObject<(value: number) => number> { constructor(public factor: number) { super((value: number) => value * this.factor); } diff --git a/projects/s-js-utils/src/lib/callable-object.ts b/projects/s-js-utils/src/lib/callable-object.ts index 5e4fac7..d00f242 100644 --- a/projects/s-js-utils/src/lib/callable-object.ts +++ b/projects/s-js-utils/src/lib/callable-object.ts @@ -1,12 +1,14 @@ +/** @hidden */ +export interface CallableObject any> { + // tslint:disable-next-line:callable-types + (...args: Parameters): ReturnType; +} + /** - * Extend this for classes whose objects are directly callable. Sadly, you'll need to define an extra interface and repeat the typing information, for now. (Maybe fixable with TypeScript 3 tuples?) + * Extend this for classes whose objects are directly callable. * * ```ts - * interface Multiplier { - * (value: number): number; - * } - * - * class Multiplier extends CallableObject { + * class Multiplier extends CallableObject<(value: number) => number> { * constructor(public factor: number) { * super((value: number) => value * this.factor); * } @@ -18,8 +20,8 @@ * doubler(2); // 6 * ``` */ -export abstract class CallableObject { - constructor(f: Function) { - return Object.setPrototypeOf(f, new.target.prototype); +export abstract class CallableObject any> { + constructor(callAction: F) { + return Object.setPrototypeOf(callAction, new.target.prototype); } } diff --git a/src/app/multiplier.ts b/src/app/multiplier.ts index 690e9c3..e42ade5 100644 --- a/src/app/multiplier.ts +++ b/src/app/multiplier.ts @@ -1,11 +1,6 @@ -import { CallableObject } from "../../projects/s-js-utils/src/lib/callable-object"; +import { CallableObject } from "s-js-utils"; -export interface Multiplier { - // tslint:disable:callable-types - (value: number): number; -} - -export class Multiplier extends CallableObject { +export class Multiplier extends CallableObject<(value: number) => number> { constructor(public factor: number) { super((value: number) => value * this.factor); }