为什么TypeScript在分配之前没有捕获到正在使用const?

时间:2019-05-29 21:34:10

标签: typescript

我有一个非常简单的示例,其中TypeScript(3.5.1)可以很好地使用代码,但是在运行时会立即引发错误。

我认为这里的问题是,在运行value之前,本质上getValue是声明为 而不是已初始化。这是非常不直观的imo,但我知道这就是JS的工作方式。

但是,为什么在这样一个简单的示例中TS无法检测到此问题?由于value是一个const,所以在我看来TS应该能够准确确定它的设置时间并预测该代码将崩溃。

console.log(getValue());

const value = "some string";

function getValue() {
  return value;
}

在没有函数调用的第二个示例中,TS确实发现在赋值之前使用了变量:

console.log(value);
const value = "some string";

TSLint的声明前无用也似乎不适用。

假设TS /棉绒将无法捕捉到此情况,那么在最初的示例中是否有最佳实践来避免这种崩溃?例如,“始终在文件顶部声明模块级const”。

2 个答案:

答案 0 :(得分:3)

您可以启用tslint的only-arrow-functions,然后将您的function getValue()替换为

const getValue = function(): string {
  return value;
}

甚至

const getValue = (): string => value;

此时,您的第一行将是编译器错误:

Block-scoped variable 'getValue' used before its declaration

答案 1 :(得分:0)

我认为上面的箭头函数答案可以最好地回答您的问题,但作为一个旁注:确定严格的工作流程也可以防止提升错误:声明vars,声明函数,调用init函数:

const value = "some string"

function startApp() { 
    console.log(getValue());
}

function getValue() {
    console.log("yo " + value)
    return value;
}

startApp()