Search code examples
javascripttypescripttypescript-definitions

How to specify a monkey patched class in the typescript definitions file?


Say I have a class A:

class A {
    constructor();

    someFunction(): void;
}

and a class B where I expect an instance of class A as a property:

class B {
    aProperty: A;
}

How can I define typescript definitions (.d.ts) for a class C with a property of class A that is monkey patched to also include a function someOtherFunction(): void;?

Additional information

In class C class A effectively looks like this:

class A {
    constructor();

    someFunction(): void;
    someOtherFunction(): void;
}

I tried to define class C as follows without any luck:

class C {
    aProperty: A | { someOtherFunction(): void; };
}

Solution

  • If you've monkey-patched the class, then it has the new method wherever it's used. You can make the types reflect that by using declaration merging:

    interface A {
        someOtherFunction(): void;
    }
    

    Playground link

    That will merge with the types for class A to make someOtherFunction available on instances of A (from a type perspective; the monkey-patching is necessary for it to be true from a runtime perspective).

    I don't know that you can scope it, though. As Konrad pointed out, you can use an intersection rather than a union for the property (aProperty: A & { someOtherFunction(): void; };). But again, if it's monkey-patched, it's monkey-patched everywhere. :-)