TypeScript 在从JavaScript文件和它们的JSDoc生成的声明文件中,未解决的类型不会转换为任何,

z2acfund  于 8个月前  发布在  TypeScript
关注(0)|答案(6)|浏览(114)

Bug报告

在TypeScript 4.5.2中,当我们使用tsc --allowJs --declaration --emitDeclarationOnly从JavaScript文件及其JSDoc注解生成声明文件时,未解析的类型不会转换为any。我在4.6.0-dev.20211204中也看到了相同的问题。

🔎 搜索词

JSDoc, allowJs, declaration

🕗 版本与回归信息

  • 在版本4.4.4和4.6.0-dev.20211204之间发生了变化。

💻 代码

使用tsc --allowJs --declaration --emitDeclarationOnly main.jsmain.js生成main.d.ts
main.js

/**
* 
* @param {SomeClass} a 
* @returns {SomeClass}
* 
*/
function f(a) {
    return a
}

🙁 实际行为

在使用4.6.0-dev.20211204main.d.ts的情况下:

/**
*
* @param {SomeClass} a
* @returns {SomeClass}
*
*/
declare function f(a: SomeClass): SomeClass;

🙂 预期行为

在使用4.4.4main.d.ts的情况下:

/**
*
* @param {SomeClass} a
* @returns {SomeClass}
*
*/
declare function f(a: any): any;
xkftehaa

xkftehaa1#

看起来我们在这里有两个相互矛盾的原则:

  • 尽可能地以原样发出用户编写的类型信息
  • 生成一个没有错误的声明文件

我不确定 --declaration --allowJs 在不指定 --checkJs 的情况下是否真的有意义——在这个方案下,你可以创建无数个无效的声明文件。根据 TS 来捕获这些错误并回退到 any 并不可靠。

8wtpewkr

8wtpewkr2#

在PDF.js的一侧,仅使用--declaration --allowJs来生成*.d.ts文件:

npx tsc --allowJs --declaration --outDir build/types/  --emitDeclarationOnly src/pdf.js web/pdf_viewer.component.js

您可以看到生成的文件:

生成的*.d.ts文件实际上对PDF.js的用户非常有用。
当我使用--checkJs调用时,我看到报告了749个错误。我认为添加注解来修复这些错误是不可行的。
在这个方案下,您可以创建任意数量的无效声明文件。
我们最好说非严格而不是无效。我认为TypeScript用户无论如何都知道如何处理非严格声明文件。

f0ofjuux

f0ofjuux3#

@tamuratak i am also a havy .js only typescript user and i think the current behavior is correct to keep the type declarations strict.
when you get invalid types we need to fix that on a other end i am also working on tooling to package .d.ts files so that you could ship complet working types even when you package your code at the end.
that is possible because .d.ts files can overlap so it does not hurt in normal cases.

Proposal

I would accept a --noneStrictDts setting that allows to convert unresolved to any but existing behavior should not change what do you think?

vi4fp9gy

vi4fp9gy4#

这与上面的any问题有些无关,但基本上是相同的上下文,一个项目使用了大量的现有JSDoc。
在PDF.js方面,仅使用--declaration --allowJs来生成*.d.ts文件:
我们在Gutenberg项目( https://github.com/WordPress/gutenberg )中也处于类似的情况。虽然我们越来越多地使用Typescript,但我们必须依赖于jsdoc -> typescript的工作流程来处理许多现有的包,其中一些相当大。
虽然我很想修复项目中存在的每一个类型问题,但我们主要希望能够尽快为用户发布类型,而绝大多数JSDoc类型仍然会让这个体验相当不错。
我不确定--declaration --allowJs是否真的有意义,如果不指定--checkJs,在这种方案下可以创建无数个无效的声明文件。
我们遇到的主要问题是,有时在使用checkJs: true时,我们可以看到成千上万的内部类型错误。(主要是因为JSDoc不如TS灵活。)但是,如果我们禁用这个功能,那么这些错误中的一小部分可能会被发布到*.d.ts文件中。
在一个例子中,尽管有很多错误,但只有一个错误被包含在了*.d.ts文件中。理想情况下,我希望tsc能为我们输出那个错误以供我们修复——这样,我们就可以在慢慢将更多内容迁移到Typescript的同时,为消费者发布有效的*.d.ts文件。

fdx2calv

fdx2calv5#

@noahtallen 似乎 "使用 tsc --allowJs --declaration 构建,然后检查 tsc output.d.ts 是否可以无错误地构建" 完全满足了您的要求?

insrf1ej

insrf1ej6#

感谢您的参与!这确实有效 👍 我认为它也很容易集成到各种工作流程中。

相关问题