Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

生成.d.ts时部分文件丢失 #42

Closed
JobinJia opened this issue Nov 9, 2021 · 9 comments
Closed

生成.d.ts时部分文件丢失 #42

JobinJia opened this issue Nov 9, 2021 · 9 comments
Labels
bug Something isn't working

Comments

@JobinJia
Copy link

JobinJia commented Nov 9, 2021

emm. 我又来了,如图
image
当前有这两个文件,且在对外暴露的index.ts文件中有引入
image
但构建之后 丢失

composables/useForm.ts
types/form.ts

这两个文件。结果如下
image

demo

@czb3279338858
Copy link

看到中文真亲切,我也遇到了相同的问题。

@qmhc
Copy link
Owner

qmhc commented Nov 10, 2021

@jiabinbin/vue3-library 不能被正常安装,这看起来并不是一个公开的 npm 包。

@JobinJia
Copy link
Author

@jiabinbin/vue3-library 不能被正常安装,这看起来并不是一个公开的 npm 包。

已删除这个依赖,本身上面的demo对这个并不影响。因为没有使用到

@qmhc
Copy link
Owner

qmhc commented Nov 10, 2021

这应该是出现了类型错误导致文件无法生成(除了少数错误不会导致文件 emit 中断)。

你可以通过添加 skipDiagnostics: false 来开启类型诊断,未添加上述选项时 logDiagnostics: true 将不会生效。

PS1:默认跳过类型诊断的初衷是因为有效率更高的 vue-tsc 来执行该步骤。

PS2:我使用 vscode 打开一些文件已经直接报出了许多类型错误(vue-tscvolar 使用 vscode 同源的类型检查服务)

@JobinJia
Copy link
Author

我去试试 我用webstorm 打开是没有任何类型错误的 我先用vue3 tsc查一遍看看

@JobinJia
Copy link
Author

JobinJia commented Nov 10, 2021

这应该是出现了类型错误导致文件无法生成(除了少数错误不会导致文件 emit 中断)。

你可以通过添加 skipDiagnostics: false 来开启类型诊断,未添加上述选项时 logDiagnostics: true 将不会生效。

PS1:默认跳过类型诊断的初衷是因为有效率更高的 vue-tsc 来执行该步骤。

PS2:我使用 vscode 打开一些文件已经直接报出了许多类型错误(vue-tscvolar 使用 vscode 同源的类型检查服务)

因为我认为vue-tsc --noEmit默认是加载的是tsconfig.json文件。所以我做了以下的操作

  1. 将script/build.js中vite-plugin-dts插件切加载的配置文件由 tsconfig.build.json 换到tsconfig.json
  2. 设置dts option中 skipDiagnostics: falselogDiagnostics: true (见script/build.js中133,134行)
  3. 控制台执行vue-tsc --noEmit。结果如下
    image
  4. 发现没有报类型错误,那么检测通过。再执行 package.json -> scriptbuild:component命令。打包报错
    如下:(emm。 有很多)
    image

以上操作已更新demo 。可拉取demo代码调试

emm, lunch time, fix latter : )

@JobinJia
Copy link
Author

更新:
之前vue-tsc 验证成功之后,执行build.js生成.d.ts文件时报的错有两种类型。

  1. 报类型错误,这个是因为,vite-plugin-dts 不支持tsconfig.json中配置的typeRoots字段
"typeRoots": ["./node_modules/@types/", "packages/types"],

因为如果我不设置这个 改用 import type { Type1, Type2 } from 'pacakges/types/xx' 这么引入,是能正常编译出之前丢失的文件(vite:dts也不会报类型的错误)
结果如下
image
这里可以看到,已经生成之前丢失的 form.d.tsuseForm.d.ts

所以
全局定义在packages/types目录下的类型,在dts插件中不生效。所以vue-tsc 能检查通过。而生成.d.ts文件时报错。

  1. 第二个是vue3编译setup script出现的问题,我不确定这个问题是dts插件的还是vue3运行时的或是其它的某个插件的。具体的情况如下图(有点怀疑是dts插件中对vue3的编译sfc的版本支持问题?)
    image
    我单独把这个.vue文件放到Vue SFC Playground 编译出来的结果是跟我本地的一样的(见该地址js 69行)

@qmhc
Copy link
Owner

qmhc commented Nov 10, 2021

目前我定位到一个问题,项目中的 .d.ts 文件没有被添加到源文件中导致一些全局类型丢失,该问题已修复,将在随后提交。

至于 ...__default__ 这个类型错误,是很早就有的一个问题了,我认为这是 vue/compiler-sfc 的一个缺陷,在同时使用 <script><script setup> 时,如果你在 <script> 中使用了 defineComponent 返回,编译结果如你所见,会将 defineComponent 的返回值重新合并到其参数中,然而这两者的类型是不兼容的,导致类型诊断出错(因为插件是使用 vue/compiler-sfc 编译后的结果进行类型生成的,这是与 vue-tsc 不一样的地方)。

image

image

以前的一个版本,我在 ...__default... 后添加 as any 解决这个问题,但是这会丢失 <script> 中的类型推导,在之后的版本移除了,现在我正在考虑一个新的解决办法。

当前可以规避这个问题的做法是,在 '<script>' 中不要使用 defineComponent,如这个示例所示。

@JobinJia
Copy link
Author

好的 非常感谢你的帮助 emm 有木有联系方式 加个好友 以后有机会多多向你请教

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

3 participants