为什么';t TypeScript捕获在赋值之前正在使用的常量?
我有一个非常简单的示例,其中TypeScript(3.5.1)可以很好地处理代码,但在运行时会立即抛出一个错误 我认为这里的问题在于本质上为什么';t TypeScript捕获在赋值之前正在使用的常量?,typescript,Typescript,我有一个非常简单的示例,其中TypeScript(3.5.1)可以很好地处理代码,但在运行时会立即抛出一个错误 我认为这里的问题在于本质上value是在getValue运行之前声明的,但没有初始化。这在我看来很不直观,但我知道JS就是这样工作的 但是,为什么TS不能在这样一个简单的示例中检测到这个问题?由于value是一个常量,因此在我看来,TS应该能够准确地确定何时设置并预测此代码崩溃 console.log(getValue()); const value=“一些字符串”; 函数getVal
value
是在getValue
运行之前声明的,但没有初始化。这在我看来很不直观,但我知道JS就是这样工作的
但是,为什么TS不能在这样一个简单的示例中检测到这个问题?由于value
是一个常量,因此在我看来,TS应该能够准确地确定何时设置并预测此代码崩溃
console.log(getValue());
const value=“一些字符串”;
函数getValue(){
返回值;
}
在没有函数调用的第二个示例中,TS捕捉到变量在赋值之前使用:
console.log(值);
const value=“一些字符串”;
TSLint在声明之前没有使用似乎也不适用
假设TS/linting无法捕捉到这一点,那么在最初的示例中是否有可以避免此崩溃的最佳实践?例如,“始终在文件顶部声明模块级常量”。您可以启用tslint,然后用
const getValue=function():字符串{
返回值;
}
甚至
constgetvalue=():string=>value;
此时,您的第一行将出现编译器错误:
Block-scoped variable 'getValue' used before its declaration
我认为上面的箭头函数答案最好地回答了您的问题,但正如旁注:决定严格的工作流也可以防止出现错误:声明变量、声明函数、调用init函数:
const value = "some string"
function startApp() {
console.log(getValue());
}
function getValue() {
console.log("yo " + value)
return value;
}
startApp()
我的答案是“测试”。类型系统和语言只能捕获某些类别的错误。同样,如果程序使用静态类型语言(如Java/C#)进行编译,您也不能期望程序不会崩溃。这是由于JS中的提升(函数被提升,const-not)导致的。ts似乎没有检查起重等事项。您可能也会在提升方面看到这个问题,但没有任何建议。我认为静态分析很难准确检测错误。它看起来像是这类东西的打字脚本。也很有趣。即使是tslint中的
在声明之前不使用规则也没有捕捉到这一点。“始终使用lambda”看起来是一个合理的解决方案。以前,我们总是在顶层(全局/模块范围)使用函数
关键字,主要是为了获得更好的调用堆栈。(请参阅)但在现在的测试中,node(本例中为ts node)实际上为我们提供了调用堆栈,其中包括命名的lambda,如const someLambda=()=>null代码>。因此,我认为没有必要为了我们的目的而使用function
关键字。我还喜欢使用const
而不是函数
保持文件的一致性。