首页 > 解决方案 > 跨多个文件具有相同名称的非导出变量导致 TS2403

问题描述

我是一个 TypeScript 新手,正在尝试编写 Node.js (Node.ts?) 后端,并尝试了解设置服务器的基础知识。我正在使用 ts-node 版本 8.6.2 和 typescript 版本 3.7.5,并以下列方式(ajv风格)为某些域对象定义验证:

// domain_obj_1.ts:
const commonSchema = {
  type: 'object',
  properties: {
    foo: { type: 'string' },
  },
};

export class DomainObject1 {
...
// domain_obj_2.ts:
const commonSchema = {
  type: 'object',
  properties: {
    bar: { type: 'string' },
  },
};

export class DomainObject2 {
...

但是,ts-node-dev吐出以下错误:

error TS2403: Subsequent variable declarations must have the same type. 
Variable 'commonSchema' must be of type '{ type: string; properties: { foo: { type: string; }; }; }',
but here has type '{ type: string; properties: { bar: { type: string; }; }; }'.

我只能假设 Typescript 正在检测这些单独的声明的冲突commonSchema,但它们没有被导出,所以我不确定这是怎么发生的。

关于 TS 及其在 Node 中的使用,我还有很多不明白的地方,但这是令人惊讶的行为,我想知道我是否遗漏了一些明显的东西。

标签: node.jstypescriptts-node

解决方案


想出了一种方法来ts-node-dev停止对我大喊大叫,这表明我的设置至少有几处​​问题。希望这个答案可以为其他挣扎于自己的构建的人提供足够的面包屑:

  1. require('ts-node/register')在每个 knex 迁移文件的顶部都有,所以我可以用现代 ES 语法编写代码。事实证明,这可能会导致双重编译问题,这似乎具有一些不可预测的下游影响。

  2. 结果还表明ts-node,需要通过设置环境变量或传递 --project (-P) 标志ts-node-dev来明确告知文件所在的位置。tsconfig.jsonTS_NODE_PROJECT

解决 #1 似乎足以解决我看到的错误,但为了正确起见,我还解决了丢失的配置文件,因此 prod 中的最终编译是可以预测的。


推荐阅读