Typescript中typeof Array[number]的含义是什么?

4xrmg8kj  于 2023-03-19  发布在  TypeScript
关注(0)|答案(4)|浏览(163)
const names = ['jacob', 'master jung', 'kyuhyun'] as const;
type Names = typeof names[number];

我得到了想要的结果,但我不懂typeof names[number]
typescript 中的typeof Array[number]是什么意思?

ogsagwnx

ogsagwnx1#

有一个用户@jcalz的注解解释了它是如何工作的,它引用了下面的代码,与OP代码类似:

const fruit = ["apple", "banana", "grape"] as const;
export type Fruit = (typeof fruit)[number]; 'apple'|'banana'|'grape';

typeof fruit就是Array<"apple" | "banana" | "grape">,因此Fruit等同于(Array<"apple" | "banana" | "grape">)[number]。语法T[K]的意思是:T的属性的类型,其键的类型为K。因此(Array<"apple" | "banana" | "grape">)[number]表示“Array<"apple" | "banana" | "grape">的属性的类型,其键的类型为number“,或者:“Array<"apple" | "banana" | "grape">的数组元素,或者:一米一米一。
该用户的另一个类似评论添加了更多的技术术语:
类型T[K]是一个查找类型,它获取键为KT的属性类型。在(typeof list)[number]中,你获取键为number(typeof list)的属性类型。像typeof list这样的数组有数字索引签名,因此它们的number键产生所有数字索引属性的并集。

sdnqo3pr

sdnqo3pr2#

typeof获取names变量的类型(readonly ['jacob', 'master jung', 'kyuhyun']),然后解析数组/元组成员类型。这称为索引访问类型或查找类型。
在语法上,它们看起来与元素访问完全相同,但它们是作为类型编写的
在本例中,我们“查询”元组成员(索引处的元组/数组)的类型'jacob' | 'master jung' | 'kyuhyun'
Playground

n6lpvg4x

n6lpvg4x3#

@OfirD的答案很棒,我建议先阅读一读,但直到我看到同样的概念并排应用于数组对象时,我才真正明白。
我冒昧地打破了你最初的例子:

我认为第5行是需要理解的最重要部分:它接受一个数组类型(readonly ["jacob", "master jung", "kyuhyun"]),并返回由数字索引产生的类型。由于编译器确切地知道数组中有什么元素,所以答案是"jacob" | "master jung" | "kyuhyun"
现在让我们用另一个例子,一个对象,我们想要一个所有键的类型,和一个所有值的类型:

我认为第12行是最重要的部分要理解:它得到test的类型(你可以看到在第2行定义的),然后说,“如果我们用它自己的键索引它,它会是什么类型?”正如你所看到的,这将是test的值的并集。

6ss1mwsb

6ss1mwsb4#

类型为Names的任何对象都必须是数组中的项。
现在,您可以执行以下操作:

const value: Names = "jacob"

相关问题