演示仓库
https://github.com/akwodkiewicz/ts-no-quick-fix
你报告的问题是?
更复杂的事情,我将在后面详细解释
用代码示例说明上述缺陷。
import { contract } from "foobar-contracts";
import { RpcService } from "rpc-lib";
class Server implements RpcService<typeof contract> {}
// ^^^^^^
如果 foobar-contracts
'指向 package.json#types
文件,而不仅仅是当 package.json#types
指向 .ts
源文件时,在 VSCode 中建议将 d.ts
接口实现为 Quick Fix。
运行 tsc --showConfig
并将其输出粘贴到这里
faulty-app
{
"compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": [
"esnext"
],
"outDir": "./dist",
"isolatedModules": true,
"experimentalDecorators": true,
"strict": true,
"noImplicitReturns": true,
"noImplicitOverride": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noEmitOnError": true,
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"useUnknownInCatchVariables": false,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": false
},
"files": [
"./src/app.ts"
],
"include": [
"src"
],
"exclude": [
"dist"
]
}
foobar-contract
{
"compilerOptions": {
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": [
"esnext"
],
"outDir": "./dist",
"declaration": true,
"declarationDir": "./dist",
"isolatedModules": true,
"experimentalDecorators": true,
"strict": true,
"noImplicitReturns": true,
"noImplicitOverride": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noEmitOnError": true,
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"useUnknownInCatchVariables": false,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": false
},
"files": [
"./src/contract.ts",
"./src/index.ts"
],
"include": [
"src"
],
"exclude": [
"dist",
"dist"
]
}
rpc-lib
{
"compilerOptions": {
"target": "es2022",
"module": "nodenext",
"moduleResolution": "nodenext",
"lib": [
"esnext"
],
"outDir": "./dist",
"declaration": true,
"declarationDir": "./dist",
"isolatedModules": true,
"experimentalDecorators": true,
"strict": true,
"noImplicitReturns": true,
"noImplicitOverride": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noEmitOnError": true,
"skipLibCheck": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"useUnknownInCatchVariables": false,
"noUncheckedIndexedAccess": true,
"verbatimModuleSyntax": false
},
"files": [
"./src/index.ts"
],
"include": [
"src"
],
"exclude": [
"dist",
"dist"
]
}
运行 tsc --traceResolution
并将其输出粘贴到这里
稍后单独提供(注解太长)
如果存在,粘贴导入模块的 package.json
{
"name": "faulty-app",
"type": "commonjs",
"main": "./dist/app.js",
"scripts": {
"build": "rm -rf dist && tsc"
},
"dependencies": {
"foobar-contracts": "workspace:*",
"rpc-lib": "workspace:*"
},
"devDependencies": {
"typescript": "5.2.2"
}
}
如果存在,粘贴目标模块的 package.json
{
"name": "foobar-contracts",
"type": "commonjs",
"main": "./dist/index.js",
"types": "./src/index.ts", // <- this causes the issue, "./dist/index.d.ts" works fine
"scripts": {
"build": "rm -rf dist && tsc"
},
"devDependencies": {
"rpc-lib": "workspace:*",
"typescript": "5.2.2"
},
"peerDependencies": {
"rpc-lib": "workspace:*"
}
}
可以在这里放置其他评论
一些更多信息:
Visual Studio Code
版本:1.85.1
提交:0ee08df0cf4527e40edc9aa28f4b5bd38bbff2b2
日期:2023-12-13T09:48:16.874Z
Electron:25.9.7
ElectronBuildId:25551756
Chromium:114.0.5735.289
Node.js:18.15.0
V8:11.4.183.29-electron.0
OS:Darwin arm64 23.1.0
值得注意的是,似乎编译器能够在 .ts
文件中找到错误,只是 IDE 体验受到了影响。
为什么使用 package.json#types
中的源文件很重要?
如果我们不依赖声明文件,我们就可以轻松跳过一些构建过程,例如使用 ESLint 进行linting和 @typescript-eslint
插件,其中一个包依赖于某些其他内部包。
类型已经在源代码中了——为什么我们需要专门生成 d.ts 文件?
如果有必要,我很乐意提供有关“为什么”的更多信息,我正在努力找出 TS 单例仓库从旧的 moduleResolution: Node
迁移到现代等效物的最佳解决方案,这可能是我在这里没有做出最佳决策的情况。
1条答案
按热度按时间00jrzges1#
在
Server
类上方添加了//@ts-expect-error
后,我在faulty-app
上运行了该命令,因为这个问题是关于未完成代码的快速修复。控制台输出。