From b3e25b964dcc08714873c6798ae24aa2a6ea03a0 Mon Sep 17 00:00:00 2001 From: Colin McDonnell Date: Fri, 22 Mar 2024 15:40:34 -0700 Subject: [PATCH] Fix #2196 --- deno/lib/__tests__/generics.test.ts | 18 ++++++++++++++++++ deno/lib/helpers/util.ts | 11 ++++++----- playground.ts | 4 ++++ src/__tests__/generics.test.ts | 18 ++++++++++++++++++ src/helpers/util.ts | 11 ++++++----- 5 files changed, 52 insertions(+), 10 deletions(-) diff --git a/deno/lib/__tests__/generics.test.ts b/deno/lib/__tests__/generics.test.ts index 388e147e7..d0a2ec025 100644 --- a/deno/lib/__tests__/generics.test.ts +++ b/deno/lib/__tests__/generics.test.ts @@ -23,3 +23,21 @@ test("generics", () => { const result = stripOuter(z.object({ a: z.string() }), { a: "asdf" }); util.assertEqual>(true); }); + +test("assignability", () => { + const createSchemaAndParse = ( + key: K, + valueSchema: VS, + data: unknown + ) => { + const schema = z.object({ + [key]: valueSchema, + }); + const parsed = schema.parse(data); + type aldsjkf = z.infer>; + const inferred: z.infer> = parsed; + // this line errors in 3.21.2 + return inferred; + }; + createSchemaAndParse("foo", z.string(), { foo: "" }); +}); diff --git a/deno/lib/helpers/util.ts b/deno/lib/helpers/util.ts index 6aa6f5dde..320bf051b 100644 --- a/deno/lib/helpers/util.ts +++ b/deno/lib/helpers/util.ts @@ -100,9 +100,9 @@ export namespace objectUtil { [k in Exclude]: U[k]; } & V; - // type optionalKeys = { - // [k in keyof T]: undefined extends T[k] ? k : never; - // }[keyof T]; + type optionalKeys = { + [k in keyof T]: undefined extends T[k] ? k : never; + }[keyof T]; type requiredKeys = { [k in keyof T]: undefined extends T[k] ? never : k; @@ -110,8 +110,9 @@ export namespace objectUtil { export type addQuestionMarks< T extends object, - R extends keyof T = requiredKeys - > = Pick, R> & Omit, R> & { [k in keyof T]?: unknown }; + R extends keyof T = requiredKeys, + O extends keyof T = optionalKeys + > = Pick & Partial> & { [k in keyof T]?: unknown }; export type identity = T; export type flatten = identity<{ [k in keyof T]: T[k] }>; diff --git a/playground.ts b/playground.ts index 4e01473b6..152125fe5 100644 --- a/playground.ts +++ b/playground.ts @@ -1,3 +1,7 @@ import { z } from "./src"; z; + +const schema = z.object({ name: z.string() }).catchall(z.string()); + +type schema = z.input; diff --git a/src/__tests__/generics.test.ts b/src/__tests__/generics.test.ts index 56460f26f..8415f1044 100644 --- a/src/__tests__/generics.test.ts +++ b/src/__tests__/generics.test.ts @@ -22,3 +22,21 @@ test("generics", () => { const result = stripOuter(z.object({ a: z.string() }), { a: "asdf" }); util.assertEqual>(true); }); + +test("assignability", () => { + const createSchemaAndParse = ( + key: K, + valueSchema: VS, + data: unknown + ) => { + const schema = z.object({ + [key]: valueSchema, + }); + const parsed = schema.parse(data); + type aldsjkf = z.infer>; + const inferred: z.infer> = parsed; + // this line errors in 3.21.2 + return inferred; + }; + createSchemaAndParse("foo", z.string(), { foo: "" }); +}); diff --git a/src/helpers/util.ts b/src/helpers/util.ts index 6aa6f5dde..320bf051b 100644 --- a/src/helpers/util.ts +++ b/src/helpers/util.ts @@ -100,9 +100,9 @@ export namespace objectUtil { [k in Exclude]: U[k]; } & V; - // type optionalKeys = { - // [k in keyof T]: undefined extends T[k] ? k : never; - // }[keyof T]; + type optionalKeys = { + [k in keyof T]: undefined extends T[k] ? k : never; + }[keyof T]; type requiredKeys = { [k in keyof T]: undefined extends T[k] ? never : k; @@ -110,8 +110,9 @@ export namespace objectUtil { export type addQuestionMarks< T extends object, - R extends keyof T = requiredKeys - > = Pick, R> & Omit, R> & { [k in keyof T]?: unknown }; + R extends keyof T = requiredKeys, + O extends keyof T = optionalKeys + > = Pick & Partial> & { [k in keyof T]?: unknown }; export type identity = T; export type flatten = identity<{ [k in keyof T]: T[k] }>;