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

Ara*_*ind 40 typescript

打字稿中的常量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)

  • @Aravind JS/TS中的数组是一个可变对象.因此`myArr`是对可变对象的常量引用.您无法将其指向其他阵列,但您可以更改阵列的内容.你(`myArr`)拿起一个盒子(`[1,2,3]`)并将它粘在你的手上(`const`).胶水意味着你不能让它去拿另一个盒子(`myArr = [4,5,6]`)或其他任何东西(`myArr ='something else'`).但胶水并不能阻止某人将某些东西放进盒子里(`myArr.push(4)`)或者替换它的一些内容(`myArr [0] = 9`). (29认同)
  • 除此之外,在 TypeScript 中,您可以使用 ReadonlyArray<T>` 来防止推送/弹出/移位等。仅编译时,但对于公共库 API 等非常有用。 (4认同)
  • 我对此感到困惑** //非常好,`myArr [0] = 9;`**。那么如何称呼它为常数呢? (2认同)

alf*_*sin 13

  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!
Run Code Online (Sandbox Code Playgroud)
  1. 从 TS 3.4 开始,有const 断言用于定义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 数组)

常量:

  • 不能重新分配
  • 用于变量

只读:

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

  • `readonly` 不允许您在数组上执行 `.push()`:`属性 'push' 在类型 'readonly any[]' 上不存在。ts(2339)` (11认同)

nir*_*ale 8

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)

  • 我不认为这实际上与手头的问题有关(关键字“ readonly”与关键字“ const”),尽管我不知道ReadonlyArray存在。 (8认同)
  • 但答案与 readonly VS const 关键字的实际行为相符。使用只读,您无法以任何方式修改对象/数组和对象/数组属性/元素。它主要用于状态管理系统,在状态管理系统中我们只想修改纯函数集合中的值,而不是其他地方。 (5认同)
  • 它与所提出的问题没有直接关系,但感谢其他信息 (5认同)

Ste*_*tef 5

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

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

如下图所示,如果您在定义属性时声明 const,您将收到错误 https://i.imgur.com/cJfDqh9.png