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 做了,而且当然,无论使用哪个编辑器,它都是可行的。
