Bruno Correia
Bruno Correia

Reputation: 18

How to extend the return type of a function passing the parameter type?

I'm trying to define an interface extending properties from the return type of an existing function. But the function has its return type defined by a parameter type. Something like the code below:

function doSomething<T: any>(myParameter: T): { myProperty: T };
interface MyInterface<A> extends ReturnType<typeof doSomething<A>> {
  newProperty1: boolean;
  newProperty2: boolean;
}

Then, when I use the interface, I would like to infer the function's parameter type, like

let something: MyInterface<number>;

resulting in a type like

{
  myProperty: number,
  newProperty1: boolean,
  newProperty2: boolean,
}

How can I achieve this?

Upvotes: 0

Views: 1483

Answers (2)

Karol Majewski
Karol Majewski

Reputation: 25790

Sadly, I don't think you can reuse the signature of doSomething. As a workaround, you could re-define it by using an interface.

interface MyCallSignature<T> {
  (myParameter: T): {
    myParameter: T
  }
}

interface MyInterface<T> extends ReturnType<MyCallSignature<T>> {
  newProperty1: boolean;
  newProperty2: boolean;
}

declare let something: MyInterface<number>;

something.myProperty; // number
something.newProperty1; // boolean
something.newProperty2; // boolean

Upvotes: 1

Simon Bruneaud
Simon Bruneaud

Reputation: 2557

Edit:

function doSomething<T extends any = {}>(myParameter: T): { myProperty: T } {
  return { myProperty: myParameter }
}

type DoSomething<T> = typeof doSomething
type MyInterface<A extends any = {}> = ReturnType<DoSomething<A>> & {
  newProperty1: boolean
  newProperty2: boolean
}

const something: MyInterface<number> = {
  myProperty: 1,
  newProperty1: true,
  newProperty2: false
}

Upvotes: 0

Related Questions