TypeScript 如果代码在 /// 引用之前,请报告错误,

z9zf31ra  于 6个月前  发布在  TypeScript
关注(0)|答案(9)|浏览(47)

a.ts:

'use strict'
/// <reference path='b.d.ts'/>

var x: Foo;

b.d.ts:

interface Foo { x: string; }
declare module "b" {
        export = Foo;
}
D:\test\refs\a> tsc a.ts
a.ts(4,8): error TS2304: Cannot find name 'Foo'.

在第11.1.1节中,规范没有提到///引用必须是文件中的第一个内容才能正常工作,尽管我记得我们曾经决定过这是正确的。如果这是规则,我们应该适当地更新规范。我们还应该向编译器添加一个错误,否则你可能需要花费一些时间来弄清楚这个问题,因为我们在调试引用解析方面没有提供太多(阅读:任何)诊断信息。

bgtovc5b

bgtovc5b1#

是否允许注解和空格?如果不允许,我认为这可能会破坏grunt-ts的"引用"转换。

a1o7rhls

a1o7rhls2#

我不会支持改变引用的语义。文件顶部不是太难的要求,而且这已经涵盖了大多数用户现有的代码。我对于在语句或声明后有引用标签会报错的情况是可以接受的。

ffdz8vbo

ffdz8vbo3#

快速查看了一下如何实现这个功能。问题在于,据我所知,在任何非提示(非注解和非空白)之后,解析器会将引用视为注解(实际上它不再寻找它们)。这实际上是一个很大的优化,因为它不需要扫描文件中的其他注解以查找更多引用。如果我们想要在非平凡的代码之后触发对引用的错误,那么我们就必须扫描文件中的每个注解,这是一个巨大的速度降低。
在不扫描每个注解的情况下,我可以在大约22秒内编译TypeScript本身。为了触发错误而检查每个注解,我只运行了大约10分钟的构建,而且还没有完成。
这个速度降低是你愿意接受的吗?

cedebl8k

cedebl8k4#

注意,我正在使用一台旧机器 - 2007年中期的iMac,4GB RAM。

vd8tlhqk

vd8tlhqk5#

实际上,看起来我有点傻,没有正确处理SyntaxKind.EndOfFileToken,导致了无限循环。

vd2z7a6w

vd2z7a6w6#

好的,我已经成功地实现了这个功能,而且没有出现明显的减速。在任何非提示结果之后出现的引用会导致以下错误。

error TS9003: References must appear before any other code.

我将为此提交一个PR。

ifmq2ha2

ifmq2ha27#

@nathggns "对,我已经成功地在没有明显变慢的情况下实现了这个功能。"你能提供一下在你做出改变前后的编译实际数字吗?谢谢!

relj7zay

relj7zay8#

@CyrusNajmabadi在链接的PR中的备选方法是否是解决此问题的有效方法?

s5a0g9ez

s5a0g9ez9#

当然,我们保持开放。但这将是一个更大的变化。

相关问题