typescript - tRPC AppRouter ditakrifkan sebagai "any" semasa import dengan Turborepo
Saya sedang menggunakan monorepo dengan Turborepo untuk menyimpan semua kod perkhidmatan mikro saya dalam satu repositori, masing-masing dengan package.json dan tsconfig.json, semuanya ditulis dalam nodejs.
dalam setiap tsconfig.json, konfigurasi adalah sama
{
"extends": "@tsconfig/node18-strictest-esm",
"compilerOptions": {
"outDir": "build",
"baseUrl": ".",
"paths": {
"@/*": ["./*"],
"@folder-a/*": ["./folder-a/*"], // masked
"@folder-b/*": ["folder-b/*"] // masked
}
},
"exclude": ["node_modules", "build"]
}
Saya mempunyai satu perkhidmatan A sebagai pelayan tRPC, dan satu perkhidmatan B sebagai klien tRPC.
Apabila saya mengimport definisi jenis AppRouter dari A ke B, definisi jenis tersebut menjadi any dalam B walaupun ia ditaip dengan betul dalam A.
Saya membuat kajian mengenainya dan mendapati isu yang serupa, dan nampaknya alias laluan mungkin menyebabkan isu ini.
Adakah terdapat sebarang penyelesaian/punca alternatif untuk ini
Jawapan #1
Seperti yang anda sebutkan, isu bagi saya disebabkan oleh alias laluan TypeScript yang ditetapkan dalam konfigurasi tsconfig.json pakej itu.
Masalah
Apabila menggunakan alias laluan (seperti @/ yang memetakan kepada ./src/) dalam TypeScript merentasi pelbagai pakej dalam monorepo TurboRepo, inferens jenis boleh rosak kerana penyusun TypeScript mungkin tidak dapat menyelesaikan laluan dengan betul apabila jenis diimport merentasi sempadan pakej.
Sebagai hasilnya, jenis AppRouter telah ditafsirkan sebagai any, kedua-duanya di sisi pelayan dan klien.
Penyelesaian
Alih Keluar Alias Laluan
Penyelesaian yang paling mudah adalah dengan menghapus alias laluan dalam tsconfig.json pakej pelayan dan menggunakan laluan relatif sebaliknya. Ini memastikan inferens jenis yang betul merentasi pakej-pakej.
// tsconfig.json
{
"compilerOptions": {
- "baseUrl": ".",
- "paths": {
- "@/*": ["./src/*"]
- }
}
}
Gunakan Import Subpath Node.js (Disyorkan)
Alternatif moden mesra-monorepo kepada alias laluan Typescript adalah import subpath Node.js, seperti yang dibincangkan dalam isu GitHub ini dan dokumen rasmi Turborepo. Penggunaannya hampir sama dengan alias laluan Typescript, kecuali bahawa ia ditakrifkan dalam package.json anda dan mesti bermula dengan # (ini adalah keperluan tegas oleh Node.js untuk memastikan import ini jelas dibezakan daripada penentu pakej luaran).
// package.json
{
"imports": {
"#*": "./src/*.ts",
"#db/schema": "./src/db/schema/index.ts",
"#services": "./src/services/index.ts"
},
}
Sesuaikan semua import anda dengan sewajarnya:
// 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";
