Skip to content

Commit 6a4fdfc

Browse files
Andaristahejlsberg
andcommitted
Optimize extendShape
Co-authored-by: Anders Hejlsberg <[email protected]>
1 parent d114394 commit 6a4fdfc

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)