首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Readonly<T>可以分配给T,而ReadonlyArray<T>不能分配给Array<T>?

在 TypeScript 中,Readonly<T>ReadonlyArray<T> 是 TypeScript 提供的两个类型工具,用于创建只读的对象和只读的数组。

Readonly<T> 是一个泛型类型工具,它接受一个类型参数 T,并返回一个新的类型,该类型将 T 中的所有属性都设置为只读。这意味着无法对 Readonly<T> 类型的对象进行修改。

ReadonlyArray<T> 是一个类似于数组的只读对象。它是一个具有与数组相同的结构和行为的对象,但是不能对其进行修改。

现在来回答为什么 Readonly<T> 可以分配给 T,而 ReadonlyArray<T> 不能分配给 Array<T>

首先,让我们看一下 Readonly<T> 的定义:

代码语言:txt
复制
type Readonly<T> = {
    readonly [P in keyof T]: T[P];
};

这个定义告诉我们,Readonly<T> 是一个将 T 中的所有属性都设置为只读的类型。因此,Readonly<T> 可以分配给 T,因为它只是将 T 中的属性设置为只读,而没有做其他的修改。

接下来,让我们看一下 ReadonlyArray<T> 的定义:

代码语言:txt
复制
interface ReadonlyArray<T> {
    readonly length: number;
    readonly [index: number]: T;
}

这个定义告诉我们,ReadonlyArray<T> 是一个具有只读属性 length 和索引签名的对象。这意味着我们不能对 ReadonlyArray<T> 类型的对象进行修改,因为它的属性都是只读的。

现在,我们来看一下为什么 ReadonlyArray<T> 不能分配给 Array<T>

假设我们有一个只读数组 readonlyArray,它的类型是 ReadonlyArray<T>。如果我们将 readonlyArray 分配给类型为 Array<T> 的变量 array,那么我们就可以通过 array 对象修改 readonlyArray 中的元素,这将违反 ReadonlyArray<T> 的只读属性。因此,TypeScript 不允许将 ReadonlyArray<T> 分配给 Array<T>

总结起来,Readonly<T> 可以分配给 T,因为它只是将 T 中的属性设置为只读,而 ReadonlyArray<T> 不能分配给 Array<T>,因为它的属性都是只读的,无法进行修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么选择XKUC5P不是XC7K325T

但XC7K325T毕竟是K7系列,资源量还是有限,如果想找一款比XC7K325T资源大,同时价格又不会贵太多的芯片,那XKUC5P绝对是一个非常不错的选择。...首先来看看下XKUC5P和XC7K325T的资源对比: XKUC5P: XC7K325T可以看到,Logic Cell的数量,XKUC5P是XC7K325T的1.5倍,DSP和Memory都是2倍多...,意味着可以在同等面积内集成更多的晶体管。...这可以改善时序性能,有助于解决一些在28nm工艺上难以收敛的时序问题。 更高的操作频率:更小的晶体管尺寸使得16nm工艺的FPGA可以在更高的频率下运行,这可能有助于实现更好的时序性能。...虽然XKUC5P比XC7K325T在各种方面都有很大优势,但价格却不会贵太多,有大量现货,有兴趣的朋友可以加微信,提供免费FPGA方面的技术支持:

25510

为什么选择XCKU5P不是XC7K325T

但XC7K325T毕竟是K7系列,资源量还是有限,如果想找一款比XC7K325T资源大,同时价格又不会贵太多的芯片,那XCKU5P绝对是一个非常不错的选择。...首先来看看下XCKU5P和XC7K325T的资源对比: XCKU5P: XC7K325T可以看到,Logic Cell的数量,XCKU5P是XC7K325T的1.5倍,DSP和Memory都是2倍多...,而且XCKU5P采用的是16nm工艺,XC7K325T由于时间比较久了,采用的还是28nm工艺,很多工程师对工艺的影响没什么太大概念,我们下来总结一下: 更高的性能:16nm制程的晶体管尺寸更小,意味着可以在同等面积内集成更多的晶体管...更高的集成度:随着晶体管尺寸的缩小,可以在同样大小的芯片上集成更多的功能和逻辑单元,使得设计更加紧凑和功能更加丰富。...这可以改善时序性能,有助于解决一些在28nm工艺上难以收敛的时序问题。 更高的操作频率:更小的晶体管尺寸使得16nm工艺的FPGA可以在更高的频率下运行,这可能有助于实现更好的时序性能。

19010

【TypeScript 演化史 — 第二章】基于控制流的类型分析 和 只读属性

radius 和 area 属性都可以从类外部读取(因为它们都不是私有(private)的),但是不能写入(因为它们都是只读(readonly)的): const unitCircle = new Circle...ReadonlyArray 类型使用这样的索引签名来阻止对索引属性的赋值: interface ReadonlyArray { readonly length: number; /...readonly [n: number]: T; } 由于只读索引签名,编译器将以下赋值标记为无效 const primesBelow10: ReadonlyArray = [2...ReadonlyArray 类型使用这样的索引签名来阻止对索引属性的赋值: interface ReadonlyArray { readonly length: number; //...readonly [n: number]: T; } 由于只读索引签名,编译器将以下赋值标记为无效 const primesBelow10: ReadonlyArray = [, ,

2K10

TS扫盲大法-基础篇

type或者interface来定义,type在实际项目中更广义些,interface更多的时候描述一个对象类型更狭义一些,他们都可以定义对象类型 不同点 type 定义好了的数据,不能重载,且扩展属性需要使用交集扩展...or 只读属性[readonly] 我们想一个对象的属性可有可无,或者一个对象属性不能修改 /*** * * 对象属性修饰符 ?...["a", "b", 3]" 为 "readonly",不能分配给可变类型 "[string, string, number]"。...,比如 ... const objkey5:result = 'e'; // error 不能将类型“"e"”分配给类型“"a" | "b" | "c" | "d"” Extract 当我们对一个对一个泛型进行...: T, key: Key) { const keyName: string = key; // 不能将类型“string | number | symbol”分配给类型“string” console.log

1K10

掌握 TypeScript:20 个提高代码质量的最佳实践

这意味着,如果你声明一个变量为字符串类型,TypeScript 将确保分配给该变量的值确实是字符串不是数字,例如。这有助于您及早发现错误,并确保您的代码按照预期工作。...这可以帮助你在编译时捕捉到类型错误,不是在运行时。...这是一种很好的方式,可以向其他开发人员(和编译器)指示一个函数不能以某种方式使用,这可以帮助捕捉潜在的错误。...例如,你可以使用泛型函数来创建任何类型的数组: function createArray(length: number, value: T): Array { let result =...例如,可以使用映射类型创建一个表示现有类型只读版本的新类型: type Readonly = { readonly [P in keyof T]: T[P] }; let obj: { a: number

4K30

接口_TypeScript笔记3

colour之所以能被发现,是因为会检查对象字面量身上的多余属性: If an object literal has any properties that the “target type” doesn’t...x: number; readonly y: number; } 紧跟在属性名前的readonly表示只读,与const约束一样,修改只读属性会抛出编译错误: let p1: Point = {...的区别在于前者用来约束变量,后者用来约束属性(变量声明之外的场景) 特殊的,只读数组有一种特别的类型表示ReadonlyArray: let ro: ReadonlyArray =...(let a: number[] = ro as number[]) 另外,readonly可以结合索引签名使用,例如: interface NetCache { readonly [propName...之所以叫索引签名,是因为它能够描述可索引值的类型,例如StringArray表示能够通过数值索引访问字符串值 注意,只有两种合法的索引签名,分别是string和number,并且二者不能同时出现: interface

60330
领券