next.js TypeScript monorepo `import type`解析错误

qgzx9mmu  于 2023-10-18  发布在  TypeScript
关注(0)|答案(1)|浏览(113)

设置

我有一个pnpm workspace,结构如下:

workspace/
├── apps/
├───── nextjs-app/
├──────── package.json 
├──────── tsconfig.json  
├──────── ...
├── packages/
├───── api/
├──────── package.json 
├──────── tsconfig.json 
├──────── index.ts
├── tsconfig.base.json
└── package.json

nextjs-app是一个Next.js启动器,除了我修改了所有的tsconfig.json文件之外,它还预配置了所有的TS。以下是三个TS配置文件的内容:

./tscofnig.base.json

{
  "compilerOptions": {
    "target": "es2017",
    "lib": ["dom", "dom.iterable", "esnext"],
    "allowJs": true,
    "skipLibCheck": true,
    "strict": true,
    "forceConsistentCasingInFileNames": true,
    "noEmit": true,
    "esModuleInterop": true,
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    "isolatedModules": true,
    "jsx": "preserve",
    "incremental": true,
    "noUncheckedIndexedAccess": true,
    "experimentalDecorators": true
  }
}

./apps/nextjs-app/tsconfig.json

{
  "extends": "../../tsconfig.base.json",
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "**/*.cjs", "**/*.mjs"],
  "exclude": ["node_modules"]
}

./packages/API/tsconfig.json

{
  "extends": "../../tsconfig.base.json",
  "include": ["index.ts"]
}

此外,./packages/api/package.json包含以下两个设置:

{
  ...
  "name": "@my-app/api",
  "main": "./index.ts",
  "types": "./index.ts"
  ...
}

最后,为了在我的NextJS项目中安装workspace包,我运行以下命令:
pnpm --filter nextjs-app add @my-app/api@workspace:*

问题

如果我在API包中有export const foo = 'bar';,我可以使用import { foo } from '@my-app/api';轻松地将其导入到Next.js应用程序中的任何位置。一切都很好。
但是如果我尝试在API包中使用import typeexport type语法,我会得到以下错误:

../../packages/api/index.ts
Module parse failed: Unexpected token (14:7)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
| export const foo = 'bar';
| 
> export type Foo = 'bar';
|

这种情况从来没有发生过,即。我可以使用import typeexport type,只要这些都发生在NextJS项目中。但是当我在API包中执行此操作时,我会得到错误。

ncecgwcz

ncecgwcz1#

我遇到了类似的事情。对于您给定的配置,我猜

"noEmit": true

在你的基础tsconfig是要阻止输出。您可以尝试多定义几个字段

outDir: "./dist", // as an example
noEmit: false,
declaration: true

/api/tsconfig.json中。重新运行tsc编译器后,outDir应该具有您要查找的类型。如果没有,希望你能有一些提示,以什么可能是错误的。

相关问题