代码1:
overflow:hidden
代码2:
let readonlyArray: ReadonlyArray<string | number> = ["test", 1, 1];
这两行代码似乎都做了类似的事情。我不知道将数组声明为let readonlyArray: Readonly<[string, number]> = ["test", 1, 1];
和ReadOnly
之间有什么区别。
另外,哪一个最适合表现,为什么?
答案 0 :(得分:3)
从性能的角度来看,两者之间应该没有任何区别,因为在运行时类型是擦除而且无论
运行相同的javascript都会运行编译时这两种类型之间存在根本区别:
Readonly<T>
- 类型与T
具有相同的形状,但所有属性都是只读的。在您的情况下,T
是元组类型[string, number]
,因此它将具有数组的所有属性以及索引0和1.因此我们可以调用push
方法,但是我们无法重新分配concat
方法。
let readonlyArray: Readonly<[string, number]> = ["test", 1, 1];
readonlyArray.concat = ()=> {} // Not valid, concat is readonly
readonlyArray.push(1); // This is valid
readonlyArray[1] = ""; // Invalid we cannot change a property by indexing
readonlyArray[3] = ""; // Valid as it was not in the original tuple type
ReadonlyArray<T>
是一个真正的只读数组,没有任何可以更改数组的方法。在您的情况下,数组中的任何项都可以是string
或number
:
let readonlyArray2: ReadonlyArray<string | number> = ["test", 1, 1];
readonlyArray2.concat = ()=> []; // Valid we can set the concat property on the object
readonlyArray2.push(1) // No push method, invalid
readonlyArray2[1] = ""; // Invalid it is read only
readonlyArray2[3] = ""; // Invalid it is read only
答案 1 :(得分:2)
Readonly<T>
不一定是数组;期望任何类型<T>
Readonly
存储值数组,类型<T>
应为[T]
不包含可变方法
let readonlyArray: Readonly<string| number> = ["test", 1, 1]; // not assignable
let readonlyArray: Readonly<[string| number]> = ["test", 1, 1]; // assignable
ReadonlyArray
默认接受数组包含可变方法
let readonlyArray: ReadonlyArray<string| number> = "test"; // not assignable
let readonlyArray: ReadonlyArray<string| number> = ["test"]; // assignable