为什么在 TypeScript 中数组会“扩展”只读数组?

mic*_*alo 2 typescript

TypeScript 使用“extends”关键字和三元运算符支持条件类型。

等于 true 的条件类型示例:

type C1 = 7 extends number ? true : false
type C2 = 7 extends number | string ? true : false
type C3 = 7 extends 7 | 'cat' | null ? true : false
type C4 = [1,2,3] extends [1,2,3] ? true : false
type C5 = any[] extends any[] ? true : false
Run Code Online (Sandbox Code Playgroud)

我理解上面的条件(即使“扩展”在非 OOP 上下文中看起来很奇怪)。

以下条件我不明白:

type Q1 = any[] extends readonly any[] ? true : false  // evals to true
type Q2 = readonly any[] extends any[] ? true : false  // evals to false
Run Code Online (Sandbox Code Playgroud)

为什么 Q1 的计算结果为 true,而 Q2 的计算结果为 false?我的预期恰恰相反,因为只读数组似乎比通用数组“更具体”。

在这种情况下,“延伸”的真正含义是什么?

我正在使用TypeScript Playground来测试这些条件。

Sil*_*olo 5

extends意思是“是……的子类型”。不多也不少。“A是”的子类型B意味着“每个实例都A可以分配给类型的变量B”。再说一次,不多也不少。

所以我们需要问的唯一问题是: a 是否T[]可分配给readonly T[]?好吧,readonly T[]允许我们访问数组的元素。T[]允许我们访问数组的元素并对其进行变异。因此T[]支持所有操作readonly T[]以及一些操作。因此,该关系成立。