在typescript中持续vs readonly
将变量声明为readonly
将不允许我们覆盖,即使它们是公共属性。
const表现如何,
const SOME_VARIABLE:number = 10;
如果我覆盖它的值,它将如何工作?
答案 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,则会出现错误 https://i.imgur.com/cJfDqh9.png记住是使用只读还是使用const的最简单方法是询问您是在变量还是属性上使用它。变量使用const,而属性使用只读。
答案 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)
我认为接受的答案并没有足够强调 const
应该与变量一起使用,而 readonly
与类/接口属性一起使用。
readonly
仅在类型检查(编译时)期间检查,而 const
在运行时检查
将一个属性声明为 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!
types
:// Type 'readonly [10, 20]'
let y = [10, 20] as const;
// Type '{ readonly text: "hello" }'
let z = { text: "hello" } as const;
有关更多信息,请参阅the docs