Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t TypeScript捕获在赋值之前正在使用的常量?_Typescript - Fatal编程技术网

为什么';t TypeScript捕获在赋值之前正在使用的常量?

为什么';t TypeScript捕获在赋值之前正在使用的常量?,typescript,Typescript,我有一个非常简单的示例,其中TypeScript(3.5.1)可以很好地处理代码,但在运行时会立即抛出一个错误 我认为这里的问题在于本质上value是在getValue运行之前声明的,但没有初始化。这在我看来很不直观,但我知道JS就是这样工作的 但是,为什么TS不能在这样一个简单的示例中检测到这个问题?由于value是一个常量,因此在我看来,TS应该能够准确地确定何时设置并预测此代码崩溃 console.log(getValue()); const value=“一些字符串”; 函数getVal

我有一个非常简单的示例,其中TypeScript(3.5.1)可以很好地处理代码,但在运行时会立即抛出一个错误

我认为这里的问题在于本质上
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
而不是
函数
保持文件的一致性。