Readonly< []>之间的差异和ReadOnlyArray<>

时间:2018-01-17 12:11:43

标签: typescript readonly

代码1:

overflow:hidden

代码2:

 let readonlyArray: ReadonlyArray<string | number> = ["test", 1, 1];

这两行代码似乎都做了类似的事情。我不知道将数组声明为let readonlyArray: Readonly<[string, number]> = ["test", 1, 1]; ReadOnly之间有什么区别。

另外,哪一个最适合表现,为什么?

2 个答案:

答案 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>是一个真正的只读数组,没有任何可以更改数组的方法。在您的情况下,数组中的任何项都可以是stringnumber

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

  • ReadonlyArray默认接受数组
  • 包含可变方法

    let readonlyArray: ReadonlyArray<string| number> = "test";      // not assignable
    
    let readonlyArray: ReadonlyArray<string| number> = ["test"];   // assignable