From a0e0efc1ff15333f0fcc7dcc9faa3d1962e9c6da Mon Sep 17 00:00:00 2001 From: ersimont <8042088+ersimont@users.noreply.github.com> Date: Sat, 1 Jun 2019 20:22:34 -0400 Subject: [PATCH] feat: better typing for `CallableObject` BREAKING CHANGE: You must supply a type parameter to `CallableObject` now. On the bright side, you no longer need to define a separate interface for its subclasses! --- .../src/lib/callable-object.spec.ts | 7 +------ .../s-js-utils/src/lib/callable-object.ts | 20 ++++++++++--------- src/app/multiplier.ts | 9 ++------- 3 files changed, 14 insertions(+), 22 deletions(-) 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); }