Typescript,在 monorepo 项目中丢失 Zod 和 tRPC 类型,类型会导致任何

2024-02-29

我的处境有点奇怪。在过去的两周里,我一直在尝试调试为什么我在 monorepo 内的项目之间丢失类型。我的后端公开了我的客户端使用的类型,但由于某种原因,某些类型无法理解并成为any。这使得我有一段时间无法在这个项目上开发任何东西。我根据该问题制作了一个示例存储库以进一步展示它。 https://github.com/Nikola-Milovic/monorepo-trpc-issue

该项目是用Yarn Workspaces它的结构如下

  • apps/site,导入 tRPC 的 NextJS 客户端AppRouter
  • apps/backend,暴露的 Express 后端AppRouter
  • apps/config,这是基础tsconfig整个项目中都使用了s
  • packages/frontend-shared,对于这个问题来说并不重要,共享 UI 组件

问题可以在客户端内部找到in the apps/site/src/lib/ApiProvider.ts https://github.com/Nikola-Milovic/monorepo-trpc-issue/blob/master/apps/site/src/lib/APIProvider.ts

// The type is imported directly from backend, here we use type alias to make it cleaner
import type { AppRouter, EmailType, ProfileType, Test } from "@company/backend/trpc";

export type { AppRouter } from "@company/backend/trpc";
import { inferProcedureOutput } from "@trpc/server";

// The type is inferred to any
// Also if you hover over the app router, the context is also any
type loginOutputType = inferProcedureOutput<AppRouter["user"]["login"]>;
//Profile type doesn't have test field but it lets me set it
const a: ProfileType = {};
a.test = false;

//Same as well here, but it errors out as it should
const b: EmailType = {};
b.test = false;

//
const t: Test = {}

类型为tRPC方法输出被推断为any由于某种原因,const a类型是别名Profile但即使我添加不存在的字段,类型检查器也不会抱怨。

The const b and const t打字正确

就打字稿配置而言,我的设置非常标准,我用这个底座tsconfig https://github.com/Nikola-Milovic/monorepo-trpc-issue/blob/master/packages/tsconfig/base.json它设置了一些合理的默认值,例如strict所有其他配置都继承自它

{
  "$schema": "https://json.schemastore.org/tsconfig",
  "display": "Default",
  "compilerOptions": {
    "composite": false,
    "declaration": true,
    "declarationMap": true,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "inlineSources": false,
    "isolatedModules": true,
    "moduleResolution": "node",
    "preserveWatchOutput": true,
    "skipLibCheck": true,

    "noUncheckedIndexedAccess": true,
    "strict": true,
    "noUnusedLocals": true,
    "noUnusedParameters": false
  },
  "exclude": ["node_modules"]
}

我尝试过修改 tsconfigs,完全重做它们,尝试删除路径别名,清理纱线缓存,尝试使用从前端到后端的项目引用,但我一直遇到同样的问题

调试起来非常困难,因为这里只发生了打字稿魔法,没有错误或任何我可以研究的东西,我遵循了tRPC设置指南,但由于某种原因,某些设置或导致类型被破坏。

我 90% 确定问题实际上不是tsconfig因为我也复制了其他人的整个设置,但它仍然导致相同的类型推断。我不知道还有什么会以这种方式影响打字稿,我最后的手段似乎是将 API 层放入一个包中,并在我的包中直接导入它,但这很糟糕,并且需要相当多的重构,而我100% 确定我当前的设置确实可以工作


我有类似的问题。我有一个 monorepo 设置,其中有 2 个包trpc-backend and mobile-app。要在前端应用程序上解决此问题,我必须添加references我的前端 tsconfig.json 的属性是

{
 ...
 "references": [{ "path": "../trpc-backend" }] 
}

执行此操作时,您将收到 ts 警告,指出引用的项目必须具有composite设置为 true。 要解决此问题,请转到后端代码并在下面添加复合属性compilerOptions so...

{
...
"compilerOptions": {
    ...
    "composite": true,
 }
}

你就完成了

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript,在 monorepo 项目中丢失 Zod 和 tRPC 类型,类型会导致任何 的相关文章

随机推荐

  • 内联块元素似乎毫无理由地断行?

    我有一些非常基本的 HTML CSS 但没有按我的预期工作 基本上我的身体设置为 400 像素宽 然后 我在 body 内有两个 div 其显式宽度分别为 300px 和 100px 此外 这两个 div 都设置为display inlin
  • 如何用SDL 2.0画正方形?

    我想做一些简单的事情 比如使用 C 和 SDL 在屏幕上画一个正方形 我复制的例子不起作用 Get window surface SDL Surface screenSurface SDL GetWindowSurface window F
  • 使用 Scikit learn 时出现 ValueError。模型的特征数量与输入的特征数量不匹配

    我正在使用 RandomForestClassifier 解决分类问题 在代码中 我将数据集拆分为训练数据和测试数据以进行预测 这是代码 from sklearn ensemble import RandomForestClassifier
  • 我们如何在sql server中选择前20%和后80%的记录

    我正在尝试选择表中前 20 的排序结果以及剩余的 后 80 结果 当我做 select top 20 percent from table 1 然后 select top 80 percent from table 1 order by d
  • R 中的 Grep 查找具有自定义“扩展”边界的单词

    我正在寻找一个正则表达式来 grep 整个单词 包括用数字或下划线分隔的单词 b将数字和下划线视为单词的一部分 而不是边界 例如 我想在 DOG MOUSE CAT DOG MOUSE CAT 中以及 DOG MOUSE9CAT 中以及表达
  • 添加 CHECK 以对多个表施加约束

    我想修改以下 DDL 以添加 CHECK 约束 以便商店的经理在同一家商店工作 并且商店提供所有产品 如果其类型为 本地 有人可以帮忙吗 CREATE TABLE employee employee number CHAR 5 NOT NU
  • 禁用表单提交按钮

    我有一个按钮 我想在提交表单时禁用该按钮 以防止用户多次提交 我曾尝试天真地使用 javascript onclick 禁用该按钮 但如果客户端验证失败 该按钮仍保持禁用状态 如何在表单成功提交时而不只是在用户单击时禁用该按钮 这是一个 A
  • 哪种方式更好地创建 vue 组件(导出默认值、defineComponent 和新 Vue)

    最近学习 Vue js 后 我对如何编写 vue 组件语法感到非常困惑 我一直在看 YouTube 教程和文章 每个人都使用不同的方法 就 vue 3 而言 我们应该使用 导出默认值以创建组件 或导出默认的defineComponent 或
  • 远程连接到 SQL Server Express 实例

    尝试连接到远程 SQL Express 实例时 我收到以下错误 A network related or instance specific error occurred while establishing a connection to
  • 如何让网页自动改变宽度?

    在HTML中 有没有办法让网页扩展到用户的显示器 比如我有一个15英寸的 但别人有一个24英寸的 该网页在他们的屏幕上很小 但适合最小尺寸 如何使页面扩展至 100 或者 95 流体宽度是通过使用百分比单位或 em 单位来实现的 这一切都是
  • iOS 语音到数字格式的文本转换

    目前我正在使用默认的 iOS 语音到文本转换 而无需为其添加任何代码 当用户说 五 时 它会显示为 五 或 5 但是 我需要将它始终转换为 5 我可以使用 SFSpeechRecognizer 或任何其他方式来实现此目的吗 这可以帮助您入门
  • 将 const std::string & 作为参数传递的日子结束了吗?

    我最近听到赫伯 萨特 Herb Sutter 的一次演讲 他提出通过的理由std vector and std string by const 大部分已经消失了 他建议现在最好编写如下所示的函数 std string do somethin
  • Excel自动计算设置

    我在 Microsoft Office Excel 2007 中有一个复杂的项目 它使用了大量的 UDF 通过 VBA 在工作簿 打开事件 我将 Excel 自动计算设置为关闭 并策略性地放置计算每当我需要时手动计算单元格的方法 以便 UD
  • ggplot to png - 自动拉伸图像

    我正在生成一个ggplot plot并将其另存为 png图像 虽然 Rstudio 中生成的绘图根据 y 轴的值进行拉伸 但当我将其另存为时 我会得到一个正方形的图像 png 如何自动获得最佳拉伸图像 png form Function t
  • 微调器的“大”滚动条

    我有一个包含大量项目的旋转器 因此简单的滚动对于用户来说非常慢 我想在 ScrollView 中使用 大 可触摸滚动条或类似的滚动条 我该怎么做 我有一个装有大量物品的旋转器 这是你问题的一部分 将 Spinner 视为类似于桌面或 Web
  • 在 C# 中接受转义序列的 Label 属性 [重复]

    这个问题在这里已经有答案了 可能的重复 C 中标签是否有显示 的属性 我正在尝试在标签中显示客户姓名 当名称中存在任何 符号时 它会显示为 例如 A B XXX显示为AB with B下划线 除了硬编码之外 有什么办法可以显示 通过设置任何
  • 基于 n 元字符的相似性度量

    我使用以下代码从单词中提取了二元语法 Scanner a new Scanner file1 PrintWriter pw1 new PrintWriter file2 while a hasNext String gram a next
  • 在 CSS 中,当列表中有列表时,我无法覆盖父列表样式

    如果我有一个 列表 其中包含规则 list style type none 以及 项目的规则 background image url whatever jpg 我似乎看不到如果我有一个 列表作为其中一个 项目的子项 则覆盖这些规则 我想让
  • 如何使用 EXISTS 子句的正确方法

    在我的 SP 中 我正在创建一个临时表 PolicyNumbers并填充它Policy Numbers基于将提供给 SP 的参数 CREATE TABLE PolicyNumbers PolicyNumber varchar 50 INSE
  • Typescript,在 monorepo 项目中丢失 Zod 和 tRPC 类型,类型会导致任何

    我的处境有点奇怪 在过去的两周里 我一直在尝试调试为什么我在 monorepo 内的项目之间丢失类型 我的后端公开了我的客户端使用的类型 但由于某种原因 某些类型无法理解并成为any 这使得我有一段时间无法在这个项目上开发任何东西 我根据该