Search code examples
typescriptreusability

TypeScript: Reuse function definitions in an interface definition


In the following piece of TypeScript definition code, I'd like to reuse the function type of baz for the baz property of the Foo interface.

declare module 'foo' {

  /* Not all exports will be reused in the interface. */
  export function bar(a: string): string

  /* Imagine a big and verbose function
     definition with plenty overloadings: */
  export function baz(a: number): number
  export function baz(a: Overloaded): number

  interface Foo {

    /* The interface is for a function, so I cannot use module */
    (a: string): string

    /* how do I reuse the full definition of the baz function? */
    baz

  }

  export default Foo

}

I have not been able to find a way to reuse the definition other than copy-paste. Is there a better way than copy-paste? It's alright if I have to define the interface first and reuse its members as static exports.


Solution

  • Type of baz can be reused with type computation (typeof and | in this case):

    // Foo will contain 2 overloads of baz
    type Foo = { (a: string): string; } | typeof baz;
    

    However note that a type is somehow different to a interface. e.g. it can not be used in class .. implements ...