Reputation: 18
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
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
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