typescript

Reusable type annotation for function declaration in Typescript?


type Func = (foo:string) => void

// function expression
const myFunctionExpression:Func = function(foo) {
  console.log(foo)
}

In the Typescript snippet above, I am using type alias to annotate the variable in a function expression.

The type alias:

type Func = (foo:string) => void

is reusable in another function expression to reduce repetition.

My question is: Is there a way to reuse this type alias to annotate a function declaration ?

// function declaration
function myFunctionDeclaration(foo:string):void {
  console.log(foo)
}

After some search online, I cannot seem to find such syntax, what am I missing?

Thanks

update:

At the time of this writing there is a ticket on github requesting for this feature: Suggestion: Type annotations and interfaces for function declarations #22063 (thanks to comment from @jcalz)


Solution

  • You can use the typescript utility types available from version 3.1 to achieve this.

    1. Parameters<Type> : https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype
    2. ReturnType<Type> : https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype

    Example fitting the question:

    Typescript Sandbox

    type Func = (foo:string) => void
    
    // function expression
    const myFunctionExpression:Func = function(foo) {
      console.log(foo)
    }
    // function declaration
    function myFunctionDeclaration(...[foo]: Parameters<Func>): ReturnType<Func> {
      console.log(foo)
    }