Typescript 为什么是只读<;T>;可分配给T,但只读Y<;T>;不可分配给数组<;T>;? type Foo={a:number} 将obj:Foo={}设为只读 让arr:number[]=[]作为只读数组

Typescript 为什么是只读<;T>;可分配给T,但只读Y<;T>;不可分配给数组<;T>;? type Foo={a:number} 将obj:Foo={}设为只读 让arr:number[]=[]作为只读数组,typescript,Typescript,我知道,ReadonlyArray类型会删除任何变异的Array方法,这意味着只读数组不符合数组的预期接口 但我不明白为什么只读对象被认为可以安全地传递给一个需要可变对象的函数。从技术上讲,readonly对象缺少隐式setter方法,因此它没有真正遵循预期的可变接口 ReadonlyArray实际上是另一种类型,因此Array和ReadonlyArray在结构上是不同的。正如您所注意到的,ReadonlyArray的实例缺少一些方法,如push和pop 它对对象不是这样工作的。没有单独的Rea

我知道,
ReadonlyArray
类型会删除任何变异的
Array
方法,这意味着只读数组不符合数组的预期接口

但我不明白为什么只读对象被认为可以安全地传递给一个需要可变对象的函数。从技术上讲,readonly对象缺少隐式setter方法,因此它没有真正遵循预期的可变接口


ReadonlyArray
实际上是另一种类型,因此
Array
ReadonlyArray
在结构上是不同的。正如您所注意到的,
ReadonlyArray
的实例缺少一些方法,如
push
pop

它对对象不是这样工作的。没有单独的
ReadonlyObject
ReadonlyObjectConstructor
。许多不应允许的操作都是允许的:

type Foo = {a: number}
let obj: Foo = {} as Readonly<Foo>
let arr: number[] = [] as ReadonlyArray<number>
type Foo={a:number}
设mutable:Foo={a:0};
设不可变:只读={a:0};
/**
*两者都能正常工作。
*/
可变=不变;
不变的=可变的;
/**
*这两种方法同样有效。
*/
赋值(不可变,{foo:1});
Object.defineProperty(不可变,'bar'{
价值:2
});

TypeScript使用结构类型系统。两个形状完全相同的对象可以相互分配。但是,
readonly
修饰符不影响结构,只影响行为。

我编写了一个ESLint插件,可能会有帮助:
type Foo = {a: number}

let mutable: Foo = { a: 0 };
let immutable: Readonly<Foo> = { a: 0 };

/**
 * Both work without error.
 */
mutable = immutable;
immutable = mutable;

/**
 * These two work as well.
 */
Object.assign(immutable, { foo: 1 });
Object.defineProperty(immutable, 'bar', {
    value: 2
});