为什么我不能在TypeScript中以这种方式将Array设为只读?

时间:2018-12-28 14:59:45

标签: typescript readonly readonly-collection

文档显示了(#ReadOnlyArray)如何使用界面来实现,但是当我探索该语言时,我想知道为什么这不能正常工作吗?

type TraverseTuple<T extends Array<unknown>> = {
     readonly [P in keyof T]: T[P];
}

const test: TraverseTuple<[string, number, string, number]> = ['s', 1, 'o', 2];

test[1] = 0; // not readonly !

2 个答案:

答案 0 :(得分:1)

有一个内置的只读数组类型,它使数组成为只读的(除非断言返回普通数组)。

const test: ReadonlyArray<string|number> = ['s', 1, 'o', 2];

test[1] = 0;

但是,对于元组,您需要创建一个显式类型,如下所示:

const test: Readonly<{ 0: string, 1: number, 2: string, 3: number }> = ['s', 1, 'o', 2];

test[1] = 1;

答案 1 :(得分:1)

明确不支持此行为。映射元组的功能刚刚在带有this PR的Typescript 3.1中引入。从PR:

  

目前,同态映射类型中的readonly-readonly+readonly注释对数组或元组元素没有影响(我们可以考虑将Array映射到{ {1}},反之亦然,尽管从技术上讲这并不是结构保留,因为它会添加或删除方法。