const names = ['jacob', 'master jung', 'kyuhyun'] as const; type Names = typeof names[number];
我得到了想要的结果,但我不懂typeof names[number]。typescript 中的typeof Array[number]是什么意思?
typeof names[number]
typeof Array[number]
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]是一个查找类型,它获取键为K的T的属性类型。在(typeof list)[number]中,你获取键为number的(typeof list)的属性类型。像typeof list这样的数组有数字索引签名,因此它们的number键产生所有数字索引属性的并集。
typeof fruit
Array<"apple" | "banana" | "grape">
Fruit
(Array<"apple" | "banana" | "grape">)[number]
T[K]
T
K
number
(typeof list)[number]
(typeof list)
typeof list
sdnqo3pr2#
typeof获取names变量的类型(readonly ['jacob', 'master jung', 'kyuhyun']),然后解析数组/元组成员类型。这称为索引访问类型或查找类型。在语法上,它们看起来与元素访问完全相同,但它们是作为类型编写的在本例中,我们“查询”元组成员(索引处的元组/数组)的类型'jacob' | 'master jung' | 'kyuhyun'Playground
typeof
names
readonly ['jacob', 'master jung', 'kyuhyun']
'jacob' | 'master jung' | 'kyuhyun'
n6lpvg4x3#
@OfirD的答案很棒,我建议先阅读一读,但直到我看到同样的概念并排应用于数组和对象时,我才真正明白。我冒昧地打破了你最初的例子:
我认为第5行是需要理解的最重要部分:它接受一个数组类型(readonly ["jacob", "master jung", "kyuhyun"]),并返回由数字索引产生的类型。由于编译器确切地知道数组中有什么元素,所以答案是"jacob" | "master jung" | "kyuhyun"。现在让我们用另一个例子,一个对象,我们想要一个所有键的类型,和一个所有值的类型:
readonly ["jacob", "master jung", "kyuhyun"]
"jacob" | "master jung" | "kyuhyun"
我认为第12行是最重要的部分要理解:它得到test的类型(你可以看到在第2行定义的),然后说,“如果我们用它自己的键索引它,它会是什么类型?”正如你所看到的,这将是test的值的并集。
test
6ss1mwsb4#
类型为Names的任何对象都必须是数组中的项。现在,您可以执行以下操作:
Names
const value: Names = "jacob"
4条答案
按热度按时间ogsagwnx1#
有一个用户@jcalz的注解解释了它是如何工作的,它引用了下面的代码,与OP代码类似:
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]
是一个查找类型,它获取键为K
的T
的属性类型。在(typeof list)[number]
中,你获取键为number
的(typeof list)
的属性类型。像typeof list
这样的数组有数字索引签名,因此它们的number
键产生所有数字索引属性的并集。sdnqo3pr2#
typeof
获取names
变量的类型(readonly ['jacob', 'master jung', 'kyuhyun']
),然后解析数组/元组成员类型。这称为索引访问类型或查找类型。在语法上,它们看起来与元素访问完全相同,但它们是作为类型编写的
在本例中,我们“查询”元组成员(索引处的元组/数组)的类型
'jacob' | 'master jung' | 'kyuhyun'
Playground
n6lpvg4x3#
@OfirD的答案很棒,我建议先阅读一读,但直到我看到同样的概念并排应用于数组和对象时,我才真正明白。
我冒昧地打破了你最初的例子:
我认为第5行是需要理解的最重要部分:它接受一个数组类型(
readonly ["jacob", "master jung", "kyuhyun"]
),并返回由数字索引产生的类型。由于编译器确切地知道数组中有什么元素,所以答案是"jacob" | "master jung" | "kyuhyun"
。现在让我们用另一个例子,一个对象,我们想要一个所有键的类型,和一个所有值的类型:
我认为第12行是最重要的部分要理解:它得到
test
的类型(你可以看到在第2行定义的),然后说,“如果我们用它自己的键索引它,它会是什么类型?”正如你所看到的,这将是test
的值的并集。6ss1mwsb4#
类型为
Names
的任何对象都必须是数组中的项。现在,您可以执行以下操作: