警告:我不知道这是否构成了对"为什么类型脚本不允许重新分配通过Function语句声明的函数?"的客观正确答案.可以肯定的是,我必须找到一些权威的文件或官方声明来提供这一特定禁令背后的理由,但到目前为止我还没有找到.因此,考虑到关于其他情况的这样的说法,以下只是一个有根据的猜测.
允许所有有效的JavaScript在类型脚本中编译而不发出编译器错误,这不是设计目标之一(尽管它is是设计目标之一,即使有这样的错误,代码也将被编译,emitted将被编译为Java脚本).发出编译器错误的试金石测试不是"这是否会在JavaScript中导致运行时错误",而是"这是否可能是一个编码错误".有关权威来源,请参阅What does "all legal JavaScript is legal TypeScript" mean?及其答案.
有关这方面的示例,请参阅:
在所有这些情况下,JavaScript都允许一些东西,并且有一个定义良好的结果,但TypeScrip认为这样做是错误的.
因此,"在普通的JavaScript中重新分配函数是非常好的代码"可能是真的,但这并不一定意味着它应该是完全好的TypeScript代码.
请注意,我并不是说我个人同意上述所有情况或这一情况的决定.我肯定有很多次不同意TS团队关于允许或禁止某些编码技术的决定,通常这归结为支持某些用例的优先级的不同.如果我认为某些用例比TS团队更重要,那么当该语言没有负担能力时,我可能会不高兴.相反,如果我认为语言中有一个重大的安全漏洞,但TS团队关心该漏洞启用的一些用例,那么当语言不健全时,我可能会不高兴.这些最终归结为真实世界的代码统计、编译器性能和TS语言维护者的主观意见的组合.
声明了function
条语句的函数不能在类型脚本中重新分配的可能原因是,TS团队认为这样做可能是错误的.
MDN's documentation for function
statements currently表示"函数声明可以重新赋值,但应避免这样做".我不知道我们是否可以认为MDN在这里是权威的,但至少有一个数据点.
一般来说,如果像这样的事情发生,那将是不幸的
parseFloat = x => 0
是不是没有错误,对吗?除非TypeScrip引入了readonly
函数声明的概念,并将每个本地JS函数标记为一个,否则我们主要只剩下两个极端:"允许所有函数重新分配(其类型匹配)"或"禁止所有函数重新分配",而TS Select 了后者.
当我查看对于GitHub来说太大的UIchecker.ts
file时,大约在第28,031行,我看到
if (assignmentKind) {
if (!(localOrExportSymbol.flags & SymbolFlags.Variable) &&
!(isInJSFile(node) && localOrExportSymbol.flags & SymbolFlags.ValueModule)) {
const assignmentError = localOrExportSymbol.flags & SymbolFlags.Enum ? Diagnostics.Cannot_assign_to_0_because_it_is_an_enum
: localOrExportSymbol.flags & SymbolFlags.Class ? Diagnostics.Cannot_assign_to_0_because_it_is_a_class
: localOrExportSymbol.flags & SymbolFlags.Module ? Diagnostics.Cannot_assign_to_0_because_it_is_a_namespace
: localOrExportSymbol.flags & SymbolFlags.Function ? Diagnostics.Cannot_assign_to_0_because_it_is_a_function
: localOrExportSymbol.flags & SymbolFlags.Alias ? Diagnostics.Cannot_assign_to_0_because_it_is_an_import
: Diagnostics.Cannot_assign_to_0_because_it_is_not_a_variable;
因此,TypeScrip的立场是,重新分配给function
语句与重新分配class
语句或module
语句是同一类错误.也就是说,这就像是一个类别错误.你不是要打击这些东西.
这就对了.我所知道的事实是,它在TypeScrip中是不允许的,而在其他不允许有效的JavaScript的情况下,这是因为TS团队认为这样的代码可能是错误的.这里可能也是如此,而且有间接证据表明这一点.