关于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


