Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to convert type to interface in Typescript

Is there a way in TypeScript to transform a type into an interface?

I already read this QA here on StackOverflow, and don't think it fits well with the description I give in this Question.

A quick example of a scenario where a Product is defined as type from a third-party TypeScript library.

// ProductFragmentOne is used to highlight the possibility of composition(unions, etc)
type Product = ProductFragmentOne & { sku: string };

To integrate that Product into our own system, it is already possible by extending(union) a type as in the following example:

export type ProductSchema = Product & { 
  name: string;
}

My question is:

  • Is there a way for our ProductSchema to be defined as an interface? Is that even possible?
# Example of how the code may look
export interface ProductSchema{ 
  name: string;
  //Do the magic to add Product properties here
}

Update: The reason for this approach is purely a preference for interface over type. It makes existing code keep its style, regardless of third party library adopted.

Thanks.

like image 627
P.M Avatar asked Mar 09 '26 20:03

P.M


1 Answers

To solve this problem, I used an answer found on a completely unrelated question: Is it "Possible to extend types in Typescript?".

In fact, since TypeScript 2.2 -- It is possible for an interface to extend a type.

There is an extensive thread on the difference between interface and type on this StackOverflow thread: TypeScript: Interfaces vs Types

export interface ProductSchema extends Product{ 
  name: string;
}

// Where the Product is a type similar to
type Product = { SKU: string }

The "magic trick" I was looking for was indeed that extends operator(or keyword). There is an additional example on TypeScript playground based on this same approach as well

like image 177
P.M Avatar answered Mar 11 '26 16:03

P.M



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!