以下为ChatGPT自动生成的解答,正确与否请自行判断。 也许你也可以从大家的发帖中找到想要的答案!
BFE.devAI解答 - TypeScript 类型谜题
35. implement Filter<T, A>
type Filter<T extends any[], U> = { [K in keyof T]: T[K] extends U ? T[K] : never;}[number];
解释:
我们定义了一个泛型类型Filter
,其中T
表示被过滤的元素组成的元组类型,U
表示过滤条件的类型。
我们给Filter
一个属性签名,使用了索引类型查询和映射类型:
[K in keyof T]: T[K] extends U ? T[K] : never;
该属性签名表示,对于T
中的每一个元素,如果该元素的类型能够赋值给U
类型,则该元素保留;否则该元素的类型为never
。最终该属性签名返回的是一个never
类型和一个U
类型的联合类型。
然后,在属性签名后加上[number]
,表示取出该联合类型中的所有U
类型元素,组成的新数组即为满足条件的元素。
举个例子,比如A = Filter<[1,'BFE', 2, true, 'dev'], number>
:
- 对于
1
这个元素,其类型是number
,能够赋值给U
类型,因此保留; - 对于
'BFE'
这个元素,其类型不是number
,因此被替换为never
类型; - 对于
2
这个元素,其类型是number
,能够赋值给U
类型,因此保留; - 对于
true
这个元素,其类型不是number
,因此被替换为never
类型; - 对于
'dev'
这个元素,其类型不是number
,因此被替换为never
类型。
因此,最终返回的数组中只有1
和2
两个元素,而且它们的类型是number
。