Typescript中的常量与只读变量
将一个变量声明为readonly
,即使它们是公共属性,也不能进行覆盖。
const
的行为:
const SOME_VARIABLE:number = 10;
如果我覆盖它的值,它会如何工作?
Typescript中的常量与只读变量
将一个变量声明为readonly
,即使它们是公共属性,也不能进行覆盖。
const
的行为:
const SOME_VARIABLE:number = 10;
如果我覆盖它的值,它会如何工作?
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;
myArr [0] = 9;
**感到困惑。你怎么能将它称为常量呢? - AravindmyArr
是对可变对象的常量引用。你不能将其指向其他数组,但可以更改数组的内容。你(myArr
)拿起了一个盒子([1, 2, 3]
)并将其黏在手上(const
)。黏合剂意味着你不能放开它并拿起另一个盒子(myArr=[4, 5, 6]
)或其他任何东西 (myArr='something else'
)。但是黏合剂并不妨碍别人往盒子里装东西(myArr.push(4)
)或替换其中的一些内容(myArr[0]=9
)。 - jcalzObject
上...我们有责任使它们变成不可变的 - 它们本身并不是不可变的。 - Pedro FerreiraReadonlyArray<T>
来防止push/pop/shift等操作。这只在编译时有效,但对于公共库的API非常有用。 - Jayconst和readonly之间的关键区别在于它们与数组的使用方式不同(除了已经提到的区别)。你必须使用:
readonly Array<T>
在使用数组时,其中T是泛型类型(请搜索了解更多)。
当您将任何数组声明为const时,您可以对数组执行可能更改数组元素的操作。例如:
const Arr = [1,2,3];
Arr[0] = 10; //OK
Arr.push(12); // OK
Arr.pop(); //Ok
//But
Arr = [4,5,6] // ERROR
但是,在只读数组的情况下,您无法像上面那样更改数组。
arr1 : readonly Array<number> = [10,11,12];
arr1.pop(); //ERROR
arr1.push(15); //ERROR
arr1[0] = 1; //ERROR
两种类型:
.push()
)const:
readonly:
readonly
关键字不允许在数组上进行 .push()
操作:Property 'push' does not exist on type 'readonly any[]'. ts(2339)
- Samathingamajigas const
不允许在数组上使用 .push()
,且会报错:属性“push”在类型上不存在
。 - mihaa123我认为被接受的答案没有强调足够多的是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!
类型
:// Type 'readonly [10, 20]'
let y = [10, 20] as const;
// Type '{ readonly text: "hello" }'
let z = { text: "hello" } as const;
更多信息,请参见文档
class TestClass {
const int _x;
TestClass(int x) : _x(x) {}
}
const
readonly
readonly
在执行期间不是常量,而 const
是。两者在编译时也都是常量。 - Ontonator