打字稿中的const和readonly之间的区别

时间:2017-10-04 09:13:44

标签: typescript

在typescript中持续vs readonly

将变量声明为readonly将不允许我们覆盖,即使它们是公共属性。

const表现如何,

const SOME_VARIABLE:number = 10;

如果我覆盖它的值,它将如何工作?

6 个答案:

答案 0 :(得分:44)

无法重新分配const变量,就像readonly属性一样。

基本上,在定义属性时,可以使用readonly来防止重新分配。这实际上只是一次编译时检查。

当您定义const变量(并定位更新版本的JavaScript以在输出中保留const)时,也会在运行时进行检查。

所以他们有效地做了同样的事情,但一个是变量,另一个是属性。

const x = 5;

// Not allowed
x = 7;


class Example {
    public readonly y = 6;
}

var e = new Example();

// Not allowed
e.y = 4;

重要提示......“无法重新分配”与不变性不同。

const myArr = [1, 2, 3];

// Not allowed
myArr = [4, 5, 6]

// Perfectly fine
myArr.push(4);

// Perfectly fine
myArr[0] = 9;

答案 1 :(得分:5)

const和readonly之间的一个关键区别在于它如何与数组一起工作。 (appart form has ans diff) 你必须使用     ReadonlyArray 使用Array时, 其中T是泛型类型(谷歌更多)。

当你将任何数组声明为const时,你可以对数组执行操作,这可能会改变数组元素。 对于前。

const Arr = [1,2,3];

Arr[0] = 10;   //OK
Arr.push(12); // OK
Arr.pop(); //Ok

//But
Arr = [4,5,6] // ERROR

但是如果是ReadonlyArray,则无法更改数组,如上所示。

arr1 : ReadonlyArray<number> = [10,11,12];

arr1.pop();    //ERROR
arr1.push(15); //ERROR
arr1[0] = 1;   //ERROR

答案 2 :(得分:5)

两者:

  • 可以更改(例如,如果使用数组,则可以通过.push()更改)

const:

  • 无法重新分配
  • 用于变量

只读:

  • 可以重新分配,但只能在构造函数内部
  • 用于属性(类成员)

答案 3 :(得分:2)

https://www.typescriptlang.org/docs/handbook/interfaces.html#readonly-vs-const

中所述

记住是使用只读还是使用const的最简单方法是询问您是在变量还是属性上使用它。变量使用const,而属性使用只读。

如下图所示,如果在定义属性时声明const,则会出现错误 https://i.imgur.com/cJfDqh9.png

答案 4 :(得分:1)

我认为这两个词的原因可能是它比替代方法更容易实现。

例如,在C ++中,类可以具有const成员。但是C ++具有特殊的语法,可以在构造函数运行之前初始化常量,因此对const永远没有真正的“赋值”,例如:

class TestClass {
    const int _x;
    TestClass(int x) : _x(x) {}
}

_x(x)在调用构造函数之前初始化_x变量。

在Typescript中,如果他们想允许将成员声明为const并认真对待变量为const,则需要添加类似的语法。

“只读”与const并不完全相同。我认为这意味着有些不同。它的意思是“允许在构造函数内部分配,但不再分配。”

答案 5 :(得分:1)

  1. 我认为接受的答案并没有足够强调 const 应该与变量一起使用,而 readonly 与类/接口属性一起使用。

  2. readonly 仅在类型检查(编译时)期间检查,而 const 在运行时检查

  3. 将一个属性声明为 readonly 并不意味着它的值不能改变:它意味着该属性不能被重新赋值,例如:


interface Person {
    readonly info: { name: string; age: number };
}

//create a new person
// ...

person.info.age += 1; // this is valid
person.info = { name: "Johnny", age: 15 }; // this is invalid!
  1. 从 TS 3.4 开始,有 const assertions 用于定义 types

// Type 'readonly [10, 20]'
let y = [10, 20] as const;

// Type '{ readonly text: "hello" }'
let z = { text: "hello" } as const;

有关更多信息,请参阅the docs