网站搜索

typescript - ts 在明确指定 typeRoots 的情况下找不到名称 ...


我正在为我的 TypeScript 3.0.3 项目构建一个单仓库结构,简化结构如下

_types/
  models.ts
package.json
tsconfig.json
packages/
  app/
    tsconfig.json
    package.json
  server/
    tsconfig.json
    package.json

所以,我将我的全局接口放在 _types 文件夹中,models.ts 的示例如下

interface ICharacterEssentials {
  username: string
  gender: 'MALE' | 'FEMALE'
  skinTone: 'DARK' | 'LIGHT'
  race: 'HUMAN' | 'ORC' | 'ELF' | 'DWARF'
}

这个接口被用在我的 packages/server/index.ts 文件中,但是我收到错误

[ts] 找不到名称 'ICharacterEssentials'。

我最初的想法是,它没有看到这是接口文件,因为它不在 /packages/server 文件夹中。所以我进入了我的 monorepos 根目录的 tsconfig.json 并在 compilerOptions 内添加了这一部分

"typeRoots": [
  "./_types/*",
  "./node_modules"
]

我的 packages/server/tsconfig.json 文件像这样继承这个

{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "noImplicitReturns": true,
    "outDir": "./dist"
  },
  "exclude": [
   "./dist"
  ]
}

我以为这会让我的 ICharacterEssentials 接口在我的服务器包内可见,但我仍然收到相同的错误。有什么建议可以解决这个问题吗?(同时也保留我的节点模块的类型定义)

答案#1

你主要的问题是你没有导出接口。试试:

export interface ICharacterEssentials {
  username: string
  gender: 'MALE' | 'FEMALE'
  skinTone: 'DARK' | 'LIGHT'
  race: 'HUMAN' | 'ORC' | 'ELF' | 'DWARF'
}

你说明了在 tsconfig.json 上进行此配置的原因…

"typeRoots": [
  "./_types/*",
  "./node_modules"
]

... 是试图让包内部的根类型可见。这是没有必要的。如果你不指定,TypeScript 会自动在任何地方查找类型。不过,你可能想这样做的一个原因是防止你的 monorepo 的根访问每个单独包中定义的类型。这取决于你自己决定。

在每个包中扩展基础 tsconfig.json 对类型解析不是必须的。我甚至会进一步建议你思考一下是否真的需要为 monorepo 中的每个包都设立单独的 tsconfig.json。我在一个大型 TypeScript monorepo 工作,我们并没有为每个包设立单独的 tsconfig.json。

回到你的问题。有趣的是,在我的测试项目中,Visual Studio Code 并没有建议在嵌套文件夹中自动导入外部的 ICharacterEssentials,但是 WebStorm 做了,而且当然,无论使用哪个编辑器,它都是可行的。