Skip to content

Commit 3e602d4

Browse files
Andaristahejlsberg
andauthored
Optimize extendShape (#4150)
Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
1 parent bfd0913 commit 3e602d4

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

deno/lib/helpers/util.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,13 @@ export namespace util {
9797
}
9898

9999
export namespace objectUtil {
100-
export type MergeShapes<U, V> = {
101-
[k in Exclude<keyof U, keyof V>]: U[k];
102-
} & V;
100+
export type MergeShapes<U, V> =
101+
// fast path when there is no keys overlap
102+
keyof U & keyof V extends never
103+
? U & V
104+
: {
105+
[k in Exclude<keyof U, keyof V>]: U[k];
106+
} & V;
103107

104108
type optionalKeys<T extends object> = {
105109
[k in keyof T]: undefined extends T[k] ? k : never;
@@ -131,11 +135,15 @@ export namespace objectUtil {
131135
};
132136
};
133137

134-
export type extendShape<A extends object, B extends object> = {
135-
[K in keyof A as K extends keyof B ? never : K]: A[K];
136-
} & {
137-
[K in keyof B]: B[K];
138-
};
138+
export type extendShape<A extends object, B extends object> =
139+
// fast path when there is no keys overlap
140+
keyof A & keyof B extends never
141+
? A & B
142+
: {
143+
[K in keyof A as K extends keyof B ? never : K]: A[K];
144+
} & {
145+
[K in keyof B]: B[K];
146+
};
139147
}
140148

141149
export const ZodParsedType = util.arrayToEnum([

src/helpers/util.ts

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -97,9 +97,13 @@ export namespace util {
9797
}
9898

9999
export namespace objectUtil {
100-
export type MergeShapes<U, V> = {
101-
[k in Exclude<keyof U, keyof V>]: U[k];
102-
} & V;
100+
export type MergeShapes<U, V> =
101+
// fast path when there is no keys overlap
102+
keyof U & keyof V extends never
103+
? U & V
104+
: {
105+
[k in Exclude<keyof U, keyof V>]: U[k];
106+
} & V;
103107

104108
type optionalKeys<T extends object> = {
105109
[k in keyof T]: undefined extends T[k] ? k : never;
@@ -131,11 +135,15 @@ export namespace objectUtil {
131135
};
132136
};
133137

134-
export type extendShape<A extends object, B extends object> = {
135-
[K in keyof A as K extends keyof B ? never : K]: A[K];
136-
} & {
137-
[K in keyof B]: B[K];
138-
};
138+
export type extendShape<A extends object, B extends object> =
139+
// fast path when there is no keys overlap
140+
keyof A & keyof B extends never
141+
? A & B
142+
: {
143+
[K in keyof A as K extends keyof B ? never : K]: A[K];
144+
} & {
145+
[K in keyof B]: B[K];
146+
};
139147
}
140148

141149
export const ZodParsedType = util.arrayToEnum([

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy