'Share types between client and server
I'm working on a project with a Node.js, Express.js & TypeScript backend (REST API) and a React, Redux & TypeScript frontend.
In the backend I have created some types for example:
models/Product.ts
export type Product = {
title: string
description: string
price: number
}
So the REST API is sending a response like the following:
{
"data": [
{"title": "Shoe", "Description": "This is a shoe.", "price": 20},
{...}
] // inside here all the Products[]
}
On the client I want to cast the data
to the type Product
array. But since the frontend and backend are different code bases and separated, I still want to take the advantage of using types on the frontend. But I want to achieve this without duplicating code. So I don't want to update 2 places when modifying or adding models.
Does someone know what is the best way to share types between client and server?
I was thinking of something like creating an endpoint on the backend which the client can hit, then it writes all the models in a single file for example
models.ts
on the client. So I think I need to loop through every file inside /models/ on the backend then parsing it in a new file which is written on the client as models.ts. But is this really a good way? Does someone know a better way of achieving this structure?
Solution 1:[1]
You can use TypeScript path mapping.
Example from a project I'm the author of:
Backend defined types inside SampleTypes.ts are reused in the client project to avoid duplicating the code.
{
"compilerOptions": {
"paths": { "@backend/*": ["../server/src/api/*"], },
}
}
../server/src/api/
-> https://github.com/winwiz1/crisp-react/tree/master/server/src/api
import { SampleRequest } from "@backend/types/SampleTypes";
Solution 2:[2]
A good way to do this is to create a npm private package with this shared types. You can take advantage of that and also share helper functions, logic that can be unduplicated, and so on.
https://docs.npmjs.com/creating-and-publishing-private-packages https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | plswork04 |
Solution 2 | VinÃcius Estevam |