我有一个非常简单的示例,其中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”。
答案 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()