为啥我不能在 TypeScript 中以这种方式只读数组?
Posted
技术标签:
【中文标题】为啥我不能在 TypeScript 中以这种方式只读数组?【英文标题】:Why can't I make an Array readonly this way in TypeScript?为什么我不能在 TypeScript 中以这种方式只读数组? 【发布时间】:2019-05-26 09:22:55 【问题描述】:文档显示 (#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 !
【问题讨论】:
【参考方案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;
【讨论】:
【参考方案2】:明确不支持此行为。映射元组的能力最近才用this PR 引入 typescript 3.1。来自公关:
同态映射类型中的
readonly
、-readonly
或+readonly
注释目前对数组或元组元素没有影响(我们可以考虑从Array
映射到ReadonlyArray
,反之亦然,尽管从技术上讲,它不会保留结构,因为它会添加或删除方法)。
【讨论】:
这是否意味着 TS 发生了重大变化? ***.com/a/42696355/3570903我应该为此打开一个问题吗? @pirix-gh 不知道,我得研究一下之前的行为是什么以上是关于为啥我不能在 TypeScript 中以这种方式只读数组?的主要内容,如果未能解决你的问题,请参考以下文章