问题
在项目中使用 typescript + tsx + node 存在各种兼容问题,包括:
[esbuild Error]: Top-level await is currently not supported with the "cjs" output format
Cannot find module 'X'. Did you mean to set the 'moduleResolution' option to 'nodenext', or to add aliases to the 'paths' option?
X is a type and must be imported using a type-only import when 'verbatimModuleSyntax' is enabled
An 'export default' must reference a value when 'verbatimModuleSyntax' is enabled, but 'X' only refers to a type
配置
配置下述文件后,以上问题得以解决。
package.json
在 package.json
中添加:"type": "module"
,
在 "script"
中使用 tsx
,例如:"dev": "npx tsx src/app.ts"
tsconfig.json
在 tsconfig.json
中设置如下内容:
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"customConditions": ["module"],
"allowArbitraryExtensions": true,
"noEmit": true,
"verbatimModuleSyntax": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
},
}
import、export
使用 export type X = {}
导出 TypeScript Type,例如:
export type X = {
item_1: string,
item_2: string
}
同样,使用 import type { X } from path
导入 TypeScript Type,例如:
import type { X } from './types'
导入和导出第三方库使用 ESM
形式,例如:
import express from 'express'
export default X