关于Vue3源码中有个类型Omit<T, keyof Map<any, any>>?

在vue3的源码里有这么一个类型

type UnwrapRefSimple<T> = T extends Function | BaseTypes | Ref | RefUnwrapBailTypes[keyof RefUnwrapBailTypes] | {

[RawSymbol]?: true;

}

? T

: T extends Map<infer K, infer V>

? Map<K, UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof Map<any, any>>>

: T extends WeakMap<infer K, infer V>

? WeakMap<K, UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof WeakMap<any, any>>>

: T extends Set<infer V> ? Set<UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof Set<any>>> : T extends WeakSet<infer V> ? WeakSet<UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof WeakSet<any>>> : T extends ReadonlyArray<any> ? {

[K in keyof T]: UnwrapRefSimple<T[K]>;

} : T extends object & {

[ShallowReactiveMarker]?: never;

} ? {

[P in keyof T]: P extends symbol ? T[P] : UnwrapRef<T[P]>;

} : T;

这里当UnwrapRefSimple<Map<string, string>>时,会有一步是Omit<T, keyof Map<any, any>>,也就是

Omit<Map<string, string>, keyof Map<any, any>>

这一步得到的结果不是{}吗?
也就是当UnwrapRefSimple<Map<string, string>>最终得到的类型是

Map<string, string> & Omit<Map<string, string>, keyof Map<any, any>>

Map<string, string> & {}

为什么要和{}交叉类型呢?


回答:

keyof 是获取目标类型上的所有成员字段组成的联合类型

// 其实就是获取 Map 上的所有属性和方法组成的集合

type Keys = keyof Map<any, any> // has | get | set | keys | ...

关于Vue3源码中有个类型Omit<T, keyof Map<any, any>>?

T extends Map<infer K, infer V> 则说明 T 是一个 mapLike, 可能会有多的属性和方法,T 是一个 Map 只是情况之一

所以这里当 TMap 的时候,得到的就是 Map,如果是 MapLike,就是对应 MapLike 的类型

Map<K, UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof Map<any, any>>>

以上是 关于Vue3源码中有个类型Omit&lt;T, keyof Map&lt;any, any&gt;&gt;? 的全部内容, 来源链接: utcz.com/p/935344.html

回到顶部