From 45b97086a5cec6991c88375411740273dc5328a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Fri, 10 Aug 2018 12:20:53 +0100 Subject: [PATCH 1/2] Fix assertions of union types --- test/typings.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/test/typings.ts b/test/typings.ts index 2f96408..6244d66 100644 --- a/test/typings.ts +++ b/test/typings.ts @@ -49,9 +49,8 @@ const personValidator = createValidator({ if (personValidator(input)) { assertType(input.name) - assertType(input.age) - input.age === undefined - input.age === 1 + if (typeof input.age !== 'undefined') assertType(input.age) + if (typeof input.age !== 'number') assertType(input.age) } const namesValidator = createValidator({ @@ -139,7 +138,8 @@ const user2Validator = createValidator({ if (user2Validator(input)) { assertType<{ first: string | undefined, last: string }>(input.name) - assertType(input.name.first) + if (typeof input.name.first !== 'undefined') assertType(input.name.first) + if (typeof input.name.first !== 'string') assertType(input.name.first) assertType(input.name.last) if (input.items !== undefined) { @@ -165,7 +165,9 @@ const specificValuesValidator = createValidator({ }) if (specificValuesValidator(input)) { - assertType(input) + if (input !== true && input !== 1000) assertType<'XX'>(input) + if (input !== 1000 && input !== 'XX') assertType(input) + if (input !== 'XX' && input !== true) assertType<1000>(input) } const metricValidator = createValidator({ From 88dad893e680dc2a58b1189c022fe0dc203d4f3b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Linus=20Unneb=C3=A4ck?= Date: Fri, 10 Aug 2018 12:21:52 +0100 Subject: [PATCH 2/2] Make "required" optional in TypeScript typings --- index.d.ts | 10 +++++++++- test/typings.ts | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/index.d.ts b/index.d.ts index da692e4..4df0819 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,4 +1,4 @@ -type AnySchema = NullSchema | BooleanSchema | NumberSchema | StringSchema | AnyEnumSchema | AnyArraySchema | AnyObjectSchema +type AnySchema = NullSchema | BooleanSchema | NumberSchema | StringSchema | AnyEnumSchema | AnyArraySchema | AnyObjectSchema | AnyAllOptionalObjectSchema type StringKeys = (keyof T) & string interface NullSchema { @@ -36,6 +36,13 @@ interface ObjectSchema, Required ex required: Required[] } +interface AnyAllOptionalObjectSchema extends AllOptionalObjectSchema> {} +interface AllOptionalObjectSchema> { + additionalProperties?: boolean + type: 'object' + properties: Properties +} + interface ArrayFromSchema extends Array> {} type ObjectFromSchema, Required extends StringKeys> = { @@ -50,6 +57,7 @@ type TypeFromSchema = ( : Schema extends StringSchema ? string : Schema extends ArraySchema ? ArrayFromSchema : Schema extends ObjectSchema ? ObjectFromSchema + : Schema extends AllOptionalObjectSchema ? ObjectFromSchema : never ) diff --git a/test/typings.ts b/test/typings.ts index 6244d66..4ccf903 100644 --- a/test/typings.ts +++ b/test/typings.ts @@ -186,3 +186,21 @@ if (metricValidator(input)) { assertType<'page-view'>(input.name) assertType(input.page) } + +const noRequiredFieldsValidator = createValidator({ + type: 'object', + properties: { + a: { type: 'string' }, + b: { type: 'string' }, + c: { type: 'string' } + } +}) + +if (noRequiredFieldsValidator(input)) { + if (typeof input.a !== 'string') assertType(input.a) + if (typeof input.b !== 'string') assertType(input.b) + if (typeof input.c !== 'string') assertType(input.c) + if (typeof input.a !== 'undefined') assertType(input.a) + if (typeof input.b !== 'undefined') assertType(input.b) + if (typeof input.c !== 'undefined') assertType(input.c) +}