我在读TypeScript Deep Dive,我看到letconst都是块范围的,这很好.显然,常量是不能更改的(它是不可变的).但为什么ReSharper鼓励我尽可能多地将let改为const呢?我假设ReSharper认为使用const而不是let会提高性能?constlet之间有速度差吗?使用const还有其他原因吗?以下面的例子为例:

for (let i = 0; i < this.InputControl.ParentQuestions.length; i++) {
    const id = this.InputControl.ParentQuestions[i].ParentId;
    const value = this.InputControl.ParentQuestions[i].ParentRequiredAnswer;
    if (!formVals[id]) return false;
    if (formVals[id].toLowerCase() != value.toLowerCase()) return false;
}

之前,我有let idlet value,但ReSharper要求我将它们改为const,这很有效,但为什么在这种情况下更好?或者无论如何?

我也找到了this question on SO,但它更多地讨论了letconst的作用,而不是为什么一个比另一个更好.它确实说尽可能多地使用const,但这有什么好处呢?

推荐答案

我同意Giorgi的说法,表现不是主要原因.代码分析器也可以确定用let声明的变量永远不会被重新分配,并像用const声明一样对其进行优化.(见鬼,Linter有规则来检测这一点,并建议使用const而不是let.)

是的,它确实向读卡器发出信号,表示您不打算分配给变量.const的好处在于,const是一种标准的信号传递方式.作为标准,它比定制 comments 更容易传递信息.(此外, comments 可能是错误的,但const不会让你错.)但我不认为这是主要的好处.

"最低特权原则"经常与const结合使用,但我为什么要关心最低特权呢?因为it helps with early detection of coding mistakes.考虑下面的代码:

function findSomethingInDocument(document) {
    let tree = getTreeFromDocument(document); // We get some sort of tree structure.
    let found;
    for (const child of tree.children) {
        if (child.someFlag) {
            tree = child; // Oops I meant found = child :(
            break;
        }
    }
    return found;
}

在这段代码中,当我打算键入found = child时,我键入了tree = child.是的,在测试中可能会发现错误.但为什么要等待测试呢?我从来没想过要被改变.如果我把它标记为const,那么我会得到immediately learned the error,因为编译器会通知我.我不必等待测试.上面的代码相当简单,但想象一下使用更多变量的更复杂算法.

Typescript相关问答推荐

条件类型中的Typescript二元组推理

为什么空对象可以将类型断言为任何内容?

如何在类型脚本中声明对象其键名称不同但类型相同?

Angular 过滤器形式基于某些条件的数组控制

了解TS类型参数列表中的分配

属性的类型,该属性是类的键,其值是所需类型

泛型和数组:为什么我最终使用了`泛型T []`而不是`泛型T []`?<><>

如何正确地对类型脚本泛型进行限制

Angular 信号:当输入信号改变值时,S触发取数的正确方式是什么?

如何在TypeScrip中使用嵌套对象中的类型映射?

Material UI / MUI系统:我如何告诉TypeScript主题是由提供程序传递的?

在包含泛型的类型脚本中引用递归类型A<;-&B

将带点的对象键重新映射为具有保留值类型的嵌套对象

在React中定义props 的不同方式.FunctionalComponent

在抽象类属性定义中扩展泛型类型

在Reaction中折叠手风琴

有没有一种更好的方法来存储内存中的数据,而不是在类型脚本中使用数组和基于索引的函数?

基于闭包类型缩小泛型类型脚本函数的范围

Route.ts文件中未导出HTTP方法

在类型{}上找不到带有string类型参数的索引签名 - TypeScript