打字稿中的常量vs只读
声明变量,readonly
即使它们是公共属性,也不允许我们覆盖它.
const如何表现,
const SOME_VARIABLE:number = 10;
Run Code Online (Sandbox Code Playgroud)
如果我覆盖它的价值,它将如何运作?
Fen*_*ton 62
一个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;
Run Code Online (Sandbox Code Playgroud)
重要说明......"不能重新分配"与不变性不一样.
const myArr = [1, 2, 3];
// Not allowed
myArr = [4, 5, 6]
// Perfectly fine
myArr.push(4);
// Perfectly fine
myArr[0] = 9;
Run Code Online (Sandbox Code Playgroud)
alf*_*sin 13
我认为接受的答案没有足够强调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!
Run Code Online (Sandbox Code Playgroud)
types
:// Type 'readonly [10, 20]'
let y = [10, 20] as const;
// Type '{ readonly text: "hello" }'
let z = { text: "hello" } as const;
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅文档
use*_*210 10
两个都:
.push()
if 数组)常量:
只读:
const和readonly之间的主要区别之一是它与数组的工作方式。(appart形式已经是ans diff)使用Array时,必须使用ReadonlyArray,其中T是泛型类型(更多信息请使用google类型)。
当您将任何数组声明为const时,您可以对数组执行操作,这可能会更改数组元素。对于前。
const Arr = [1,2,3];
Arr[0] = 10; //OK
Arr.push(12); // OK
Arr.pop(); //Ok
//But
Arr = [4,5,6] // ERROR
Run Code Online (Sandbox Code Playgroud)
但是在ReadonlyArray的情况下,您不能如上所述更改数组。
arr1 : ReadonlyArray<number> = [10,11,12];
arr1.pop(); //ERROR
arr1.push(15); //ERROR
arr1[0] = 1; //ERROR
Run Code Online (Sandbox Code Playgroud)
如https://www.typescriptlang.org/docs/handbook/interfaces.html#readonly-vs-const所述
记住是使用 readonly 还是 const 的最简单方法是询问您是在变量还是属性上使用它。变量使用 const 而属性使用只读。
如下图所示,如果您在定义属性时声明 const,您将收到错误 https://i.imgur.com/cJfDqh9.png
归档时间: |
|
查看次数: |
16993 次 |
最近记录: |