typescript - Η AppRouter του tRPC ορίζεται ως "any" κατά την εισαγωγή με Turborepo
Αυτή τη στιγμή χρησιμοποιώ ένα monorepo με Turborepo για να αποθηκεύω όλο τον κώδικα των μικροσέρβισών μου σε ένα ενιαίο αποθετήριο, καθένα με ένα package.json και ένα tsconfig.json, όλα γραμμένα σε nodejs.
σε κάθε tsconfig.json, η ρύθμιση είναι ίδια
{
"extends": "@tsconfig/node18-strictest-esm",
"compilerOptions": {
"outDir": "build",
"baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@folder-a/*": ["./folder-a/*"], // masked
"@folder-b/*": ["folder-b/*"] // masked
}
},
"exclude": ["node_modules", "build"]
}
Έχω μία υπηρεσία A ως διακομιστή tRPC, και μία υπηρεσία B ως πελάτη tRPC.
Όταν εισήγαγα τον ορισμό τύπου του AppRouter από το A στο B, ο ορισμός τύπου γίνεται any στο B ενώ είναι σωστά τυποποιημένος στο A.
Έκανα έρευνα σχετικά με αυτό και βρήκα παρόμοιο πρόβλημα, και φαίνεται ότι το ψευδώνυμο διαδρομής μπορεί να προκαλεί αυτό το πρόβλημα.
Υπάρχει κάποια λύση/εναλλακτική αιτία για αυτό;
Απάντηση #1
Όπως ακριβώς ανέφερες, το πρόβλημα για μένα προκλήθηκε από τα ψευδώνυμα διαδρομών TypeScript που ορίζονται στη διαμόρφωση tsconfig.json του πακέτου.
Το πρόβλημα
Όταν χρησιμοποιείτε ψευδώνυμα διαδρομών (όπως @/ που αντιστοιχεί σε ./src/) στο TypeScript σε διαφορετικά πακέτα μέσα σε ένα TurboRepo monorepo, η συμπερασματοποίηση τύπων μπορεί να αποτύχει επειδή ο μεταγλωττιστής TypeScript ενδέχεται να μην επιλύει σωστά τις διαδρομές όταν οι τύποι εισάγονται πέρα από τα όρια των πακέτων.
Ως αποτέλεσμα, ο τύπος AppRouter συμπεραζόταν ως any, τόσο στην πλευρά του διακομιστή όσο και στην πλευρά του πελάτη.
Λύσεις
Κατάργηση Ψευδωνύμων Διαδρομής
Η πιο απλή λύση είναι να αφαιρέσετε τα alias διαδρομών στο αρχείο tsconfig.json του πακέτου διακομιστή και να χρησιμοποιήσετε σχετικές διαδρομές αντ' αυτού. Αυτό εξασφαλίζει σωστή συναγωγή τύπων μεταξύ των πακέτων.
// tsconfig.json
{
"compilerOptions": {
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
}
}
Χρησιμοποιήστε Υπομονοπάτι Εισαγωγών Node.js (Προτιμώμενο)
Μια σύγχρονη εναλλακτική φιλική προς τα monorepo για τα aliases διαδρομών του Typescript είναι οι υποδιαδρομές εισαγωγών (subpath imports) του Node.js, όπως συζητείται σε αυτό το ζήτημα στο GitHub και στα επίσημα έγγραφα του Turborepo. Η χρήση είναι σχεδόν ίδια με ένα alias διαδρομής του Typescript, εκτός του ότι ορίζονται στο package.json σας και πρέπει να ξεκινούν με # (αυτό είναι μια αυστηρή απαίτηση από το Node.js για να διασφαλιστεί ότι αυτές οι εισαγωγές ξεχωρίζουν σαφώς από τα εξωτερικά package specifiers)
// package.json
{
"imports": {
"#*": "./src/*.ts",
"#db/schema": "./src/db/schema/index.ts",
"#services": "./src/services/index.ts"
},
}
Ρυθμίστε όλες τις εισαγωγές σας αναλόγως:
// Old style with relative paths
import type { Filter } from "../../conditions"
import { pagesTable } from "../db/schema";
// New style with subpath imports
import { Filter } from "#conditions";
import { pagesTable } from "#db/schema";
