我正在为TypeScript 3.0.3项目开发monorepo结构,简化后的结构看起来像这样
_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
接口在服务器包中可见,但是仍然出现相同的错误。有关如何解决此问题的任何建议? (同时还保留了我的节点模块的类型定义)
答案 0 :(得分: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确实可以,并且无论使用什么编辑器,它都可以正常工作。