在阅读TypeScript源码时,在 src\compiler\types.ts 文件中看到这么一段代码:
export type MatchingKeys<TRecord, TMatch, K extends keyof TRecord = keyof TRecord> = K extends (TRecord[K] extends TMatch ? K : never) ? K : never;
乍一看有点晕,仔细分析一下:
这段代码创建了一个名为“MatchingKeys”的类型,它接受三个泛型参数:TRecord、TMatch和K。
第一个参数TRecord表示一个具有各种属性的对象或记录。
第二个参数 TMatch 表示我们希望在记录中匹配的值类型。
最后,K 表示记录中键的一个子集。
然后,代码使用条件类型检查记录中的每个键(由 K 表示)是否具有与 TMatch 指定的类型匹配的值。
如果不匹配,那么该键将被排除在最终 MatchingKeys 类型之外。
进一步分解这个过程:
- 首先定义我们的通用参数:TRecord 是任何具有属性的对象或记录; TMatch 是任何特定的数据类型; K 是对象的键子集。
- 接下来我们使用条件类型来检查对象中的每个键(由 K 表示)是否具有与指定数据类型(TMatch)匹配的值。
- 如果这两个类型之间有一个给定键(K)的匹配,那么它将被包含在我们最终的 MatchingKeys 类型的一部分中。
- 然而,如果这两个类型之间没有给定键(K)的匹配,那么它将被排除在我们的最终MatchingKeys类型。
最后,我们返回由 K 表示的所有匹配键,或者什么都不返回,这取决于在比较过程中是否至少找到一个匹配对。
总结一下:
这段代码定义了一个类型MatchingKeys,它是一个函数,接受三个参数TRecord、TMatch和K。
如果TRecord与给定的TMatch匹配,则该函数返回TRecord的键。
如果 TRecord 不匹配给定的 TMatch,则它返回 never。
不知我理解的对不对,有不正确的地方,欢迎留言指正,也欢迎关注文本魔术公众号,了解更多