Typescript 只读类型的赋值无效

Typescript 只读类型的赋值无效,typescript,Typescript,我偶然发现了一些我不确定发生了什么事。考虑下面的代码: interface T1 { value: number } interface T2 { readonly value: number } const t2: T2 = { value: 0 } t2.value += 1 const t1: T1 = t2 t1.value += 1 为什么t2可以分配到t1?使用TypeScript 3.7+(可能也是较早的版本,但我还没有测试过),除了t2.value+=1编译之外,其他都可以。

我偶然发现了一些我不确定发生了什么事。考虑下面的代码:

interface T1 { value: number }
interface T2 { readonly value: number }

const t2: T2 = { value: 0 }
t2.value += 1
const t1: T1 = t2
t1.value += 1
为什么
t2
可以分配到
t1
?使用TypeScript 3.7+(可能也是较早的版本,但我还没有测试过),除了
t2.value+=1
编译之外,其他都可以。如果
t2
在运行时真的像下面这样是只读的,这将导致运行时错误

interface T { value: number }

const t2 = Object.freeze({ value: 0 })
const t1: T = t2
t1.value += 1

以下是与您的第一个代码片段相对应的js代码:

var t2 = { value: 0 };
// t2.value += 1
var t1 = t2;
t1.value += 1;
这是第二个:

var t2 = Object.freeze({ value: 0 });
var t1 = t2;
t1.value += 1;
Readonly
仅在编译时使用,但在传输到js时会丢失,因此不会出现运行时错误


您可以进行分配,因为您在
t1
上指定了类型
t2
具有正确赋值所需的属性,但
T1
中的
value
不是只读的

以下是与您的第一个代码片段相对应的js代码:

var t2 = { value: 0 };
// t2.value += 1
var t1 = t2;
t1.value += 1;
这是第二个:

var t2 = Object.freeze({ value: 0 });
var t1 = t2;
t1.value += 1;
Readonly
仅在编译时使用,但在传输到js时会丢失,因此不会出现运行时错误


您可以进行分配,因为您在
t1
上指定了类型
t2
具有正确赋值所需的属性,但
T1
中的
value
不是只读的

相关t1不是t2的副本,t1是对同一对象t2的引用,它将给出错误。Object.freeze将使value属性为只读,即使在分配给其他变量后,也无法更改它。在Object.freze中,是。我的意思是在第一个例子中。是的,它是一个引用,但我的意思是它有相应的属性作为有效赋值,不管readonly modifiert1不是t2的副本,t1是对相同对象t2的引用,它会给出错误。Object.freeze将使value属性为只读,即使在分配给其他变量后,也无法更改它。在Object.freze中,是。我的意思是在第一个例子中。是的,它是一个引用,但我的意思是它有相应的属性作为有效赋值,而不管那个只读修饰符