Skip to content

Commit 757893c

Browse files
benjamin.ecksteinCairn
authored andcommitted
fix(openapi-typescript-helpers): preserve built-in objects in Readable/Writable types for TS6
In TypeScript 6, `Date extends object` evaluates to `true` (changed from TS5). This caused `Readable<T>` and `Writable<T>` to structurally expand Date, RegExp, and function fields instead of preserving them. Add a guard clause for built-in objects (Date, RegExp, functions) before the `T extends object` branch in both type utilities. Ref: #2723
1 parent 541d6e0 commit 757893c

3 files changed

Lines changed: 300 additions & 275 deletions

File tree

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
---
22
"openapi-typescript": patch
3+
"openapi-typescript-helpers": patch
34
---
45

5-
feat(openapi-typescript): add TypeScript 6 support
6+
feat: add TypeScript 6 support
7+
8+
- Widen peer dep to `^5.x || ^6.x`
9+
- Fix `Readable<T>` and `Writable<T>` to preserve built-in objects (Date, RegExp, functions) that now match `extends object` in TS6

packages/openapi-typescript-helpers/src/index.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,11 @@ export type Readable<T> =
223223
? Readable<U>
224224
: T extends (infer E)[]
225225
? Readable<E>[]
226-
: T extends object
227-
? { [K in keyof T as NonNullable<T[K]> extends $Write<any> ? never : K]: Readable<T[K]> }
228-
: T;
226+
: T extends Date | RegExp | ((...args: never[]) => unknown)
227+
? T
228+
: T extends object
229+
? { [K in keyof T as NonNullable<T[K]> extends $Write<any> ? never : K]: Readable<T[K]> }
230+
: T;
229231

230232
/**
231233
* Resolve type for writing (requests): strips $Read properties, unwraps $Write
@@ -240,8 +242,10 @@ export type Writable<T> =
240242
? Writable<U>
241243
: T extends (infer E)[]
242244
? Writable<E>[]
243-
: T extends object
244-
? { [K in keyof T as NonNullable<T[K]> extends $Read<any> ? never : K]: Writable<T[K]> } & {
245-
[K in keyof T as NonNullable<T[K]> extends $Read<any> ? K : never]?: never;
246-
}
247-
: T;
245+
: T extends Date | RegExp | ((...args: never[]) => unknown)
246+
? T
247+
: T extends object
248+
? { [K in keyof T as NonNullable<T[K]> extends $Read<any> ? never : K]: Writable<T[K]> } & {
249+
[K in keyof T as NonNullable<T[K]> extends $Read<any> ? K : never]?: never;
250+
}
251+
: T;

0 commit comments

Comments
 (0)