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.js
从main.js
生成main.d.ts
main.js
/**
*
* @param {SomeClass} a
* @returns {SomeClass}
*
*/
function f(a) {
return a
}
🙁 实际行为
在使用4.6.0-dev.20211204
、main.d.ts
的情况下:
/**
*
* @param {SomeClass} a
* @returns {SomeClass}
*
*/
declare function f(a: SomeClass): SomeClass;
🙂 预期行为
在使用4.4.4
、main.d.ts
的情况下:
/**
*
* @param {SomeClass} a
* @returns {SomeClass}
*
*/
declare function f(a: any): any;
6条答案
按热度按时间xkftehaa1#
看起来我们在这里有两个相互矛盾的原则:
我不确定
--declaration --allowJs
在不指定--checkJs
的情况下是否真的有意义——在这个方案下,你可以创建无数个无效的声明文件。根据 TS 来捕获这些错误并回退到any
并不可靠。8wtpewkr2#
在PDF.js的一侧,仅使用
--declaration --allowJs
来生成*.d.ts
文件:您可以看到生成的文件:
生成的
*.d.ts
文件实际上对PDF.js的用户非常有用。当我使用
--checkJs
调用时,我看到报告了749个错误。我认为添加注解来修复这些错误是不可行的。在这个方案下,您可以创建任意数量的无效声明文件。
我们最好说非严格而不是无效。我认为TypeScript用户无论如何都知道如何处理非严格声明文件。
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?
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文件。fdx2calv5#
@noahtallen 似乎 "使用
tsc --allowJs --declaration
构建,然后检查tsc output.d.ts
是否可以无错误地构建" 完全满足了您的要求?insrf1ej6#
感谢您的参与!这确实有效 👍 我认为它也很容易集成到各种工作流程中。