关于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 | ...
T extends Map<infer K, infer V>
则说明 T
是一个 mapLike
, 可能会有多的属性和方法,T 是一个 Map 只是情况之一
所以这里当 T
是 Map
的时候,得到的就是 Map
,如果是 MapLike
,就是对应 MapLike
的类型
Map<K, UnwrapRefSimple<V>> & UnwrapRef<Omit<T, keyof Map<any, any>>>
以上是 关于Vue3源码中有个类型Omit<T, keyof Map<any, any>>? 的全部内容, 来源链接: utcz.com/p/935344.html