From: Robert Sesek Date: Sun, 19 Jul 2020 21:58:02 +0000 (-0400) Subject: Have isFormT match on derived form types by walking the prototype chain. X-Git-Tag: 2.0.0~14 X-Git-Url: https://src.bluestatic.org/?a=commitdiff_plain;h=4255771f5c68921ebfa9478f7b1236911c8a8841;p=ustaxlib.git Have isFormT match on derived form types by walking the prototype chain. --- diff --git a/src/core/Form.test.ts b/src/core/Form.test.ts index 4178d19..5b00536 100644 --- a/src/core/Form.test.ts +++ b/src/core/Form.test.ts @@ -92,3 +92,22 @@ test('form types', () => { expect(isFormT(new FormA(), FormB)).toBe(false); expect(isFormT(new FormB(), FormB)).toBe(true); }); + +test('derived form types', () => { + class Base extends Form { + readonly name = 'Base'; + readonly lines = {}; + }; + class Derived extends Base {}; + class SecondDerived extends Derived {}; + + expect(isFormT(new Base(), Base)).toBe(true); + expect(isFormT(new Derived(), Derived)).toBe(true); + + expect(isFormT(new Derived(), Base)).toBe(true); + expect(isFormT(new Base(), Derived)).toBe(false); + + expect(isFormT(new SecondDerived(), SecondDerived)).toBe(true); + expect(isFormT(new SecondDerived(), Derived)).toBe(true); + expect(isFormT(new SecondDerived(), Base)).toBe(true); +}); diff --git a/src/core/Form.ts b/src/core/Form.ts index dc7e70a..6aaece8 100644 --- a/src/core/Form.ts +++ b/src/core/Form.ts @@ -66,5 +66,9 @@ export type FormClass = new (...args: any[]) => T; export function isFormT(form: Form, formClass: FormClass): form is T { - return form.constructor === formClass; + for (let proto = form; proto !== null; proto = Object.getPrototypeOf(proto)) { + if (proto.constructor === formClass) + return true; + } + return false; }