【问题标题】: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 !

【问题讨论】:

    标签: typescript readonly readonly-collection


    【解决方案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 发生了重大变化? stackoverflow.com/a/42696355/3570903我应该为此打开一个问题吗?
      • @pirix-gh 不知道,我得研究一下之前的行为是什么
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 2016-10-07
      相关资源
      最近更新 更多