-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #28 from GoNZooo/r.typescript-basic-tests
fix: output correct type for optional constructor arguments in TypeScript
- Loading branch information
Showing
12 changed files
with
409 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
import * as svt from "simple-validation-tools"; | ||
|
||
export enum StringValues { | ||
first = "first", | ||
second = "second", | ||
third = "Third", | ||
fourth = "Fourth", | ||
} | ||
|
||
export function isStringValues(value: unknown): value is StringValues { | ||
return [StringValues.first, StringValues.second, StringValues.third, StringValues.fourth].some((v) => v === value); | ||
} | ||
|
||
export function validateStringValues(value: unknown): svt.ValidationResult<StringValues> { | ||
return svt.validateOneOfLiterals<StringValues>(value, [StringValues.first, StringValues.second, StringValues.third, StringValues.fourth]); | ||
} | ||
|
||
export enum IntValues { | ||
first = 1, | ||
second = 2, | ||
third = 3, | ||
fourth = 4, | ||
} | ||
|
||
export function isIntValues(value: unknown): value is IntValues { | ||
return [IntValues.first, IntValues.second, IntValues.third, IntValues.fourth].some((v) => v === value); | ||
} | ||
|
||
export function validateIntValues(value: unknown): svt.ValidationResult<IntValues> { | ||
return svt.validateOneOfLiterals<IntValues>(value, [IntValues.first, IntValues.second, IntValues.third, IntValues.fourth]); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import * as svt from "simple-validation-tools"; | ||
|
||
import * as basicStruct from "./basicStruct"; | ||
|
||
export type StructUsingImport = { | ||
field: basicStruct.BasicStruct; | ||
}; | ||
|
||
export function isStructUsingImport(value: unknown): value is StructUsingImport { | ||
return svt.isInterface<StructUsingImport>(value, {field: basicStruct.isBasicStruct}); | ||
} | ||
|
||
export function validateStructUsingImport(value: unknown): svt.ValidationResult<StructUsingImport> { | ||
return svt.validate<StructUsingImport>(value, {field: basicStruct.validateBasicStruct}); | ||
} | ||
|
||
export type UnionUsingImport = ConstructorWithPayload; | ||
|
||
export enum UnionUsingImportTag { | ||
ConstructorWithPayload = "ConstructorWithPayload", | ||
} | ||
|
||
export type ConstructorWithPayload = { | ||
type: UnionUsingImportTag.ConstructorWithPayload; | ||
data: basicStruct.BasicStruct; | ||
}; | ||
|
||
export function ConstructorWithPayload(data: basicStruct.BasicStruct): ConstructorWithPayload { | ||
return {type: UnionUsingImportTag.ConstructorWithPayload, data}; | ||
} | ||
|
||
export function isUnionUsingImport(value: unknown): value is UnionUsingImport { | ||
return [isConstructorWithPayload].some((typePredicate) => typePredicate(value)); | ||
} | ||
|
||
export function isConstructorWithPayload(value: unknown): value is ConstructorWithPayload { | ||
return svt.isInterface<ConstructorWithPayload>(value, {type: UnionUsingImportTag.ConstructorWithPayload, data: basicStruct.isBasicStruct}); | ||
} | ||
|
||
export function validateUnionUsingImport(value: unknown): svt.ValidationResult<UnionUsingImport> { | ||
return svt.validateWithTypeTag<UnionUsingImport>(value, {[UnionUsingImportTag.ConstructorWithPayload]: validateConstructorWithPayload}, "type"); | ||
} | ||
|
||
export function validateConstructorWithPayload(value: unknown): svt.ValidationResult<ConstructorWithPayload> { | ||
return svt.validate<ConstructorWithPayload>(value, {type: UnionUsingImportTag.ConstructorWithPayload, data: basicStruct.validateBasicStruct}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
import * as svt from "simple-validation-tools"; | ||
|
||
export type HasOptionalString = { | ||
stringField?: string; | ||
optionalArrayField?: number[]; | ||
arrayOfOptionalField: (number | null | undefined)[]; | ||
}; | ||
|
||
export function isHasOptionalString(value: unknown): value is HasOptionalString { | ||
return svt.isInterface<HasOptionalString>(value, {stringField: svt.optional(svt.isString), optionalArrayField: svt.optional(svt.arrayOf(svt.isNumber)), arrayOfOptionalField: svt.arrayOf(svt.optional(svt.isNumber))}); | ||
} | ||
|
||
export function validateHasOptionalString(value: unknown): svt.ValidationResult<HasOptionalString> { | ||
return svt.validate<HasOptionalString>(value, {stringField: svt.validateOptional(svt.validateString), optionalArrayField: svt.validateOptional(svt.validateArray(svt.validateNumber)), arrayOfOptionalField: svt.validateArray(svt.validateOptional(svt.validateNumber))}); | ||
} | ||
|
||
export type HasOptionalConstructor = DoesNot | Does | HasOptionalStruct; | ||
|
||
export enum HasOptionalConstructorTag { | ||
DoesNot = "DoesNot", | ||
Does = "Does", | ||
HasOptionalStruct = "HasOptionalStruct", | ||
} | ||
|
||
export type DoesNot = { | ||
type: HasOptionalConstructorTag.DoesNot; | ||
data: number; | ||
}; | ||
|
||
export type Does = { | ||
type: HasOptionalConstructorTag.Does; | ||
data?: number; | ||
}; | ||
|
||
export type HasOptionalStruct = { | ||
type: HasOptionalConstructorTag.HasOptionalStruct; | ||
data?: HasOptionalString; | ||
}; | ||
|
||
export function DoesNot(data: number): DoesNot { | ||
return {type: HasOptionalConstructorTag.DoesNot, data}; | ||
} | ||
|
||
export function Does(data?: number): Does { | ||
return {type: HasOptionalConstructorTag.Does, data}; | ||
} | ||
|
||
export function HasOptionalStruct(data?: HasOptionalString): HasOptionalStruct { | ||
return {type: HasOptionalConstructorTag.HasOptionalStruct, data}; | ||
} | ||
|
||
export function isHasOptionalConstructor(value: unknown): value is HasOptionalConstructor { | ||
return [isDoesNot, isDoes, isHasOptionalStruct].some((typePredicate) => typePredicate(value)); | ||
} | ||
|
||
export function isDoesNot(value: unknown): value is DoesNot { | ||
return svt.isInterface<DoesNot>(value, {type: HasOptionalConstructorTag.DoesNot, data: svt.isNumber}); | ||
} | ||
|
||
export function isDoes(value: unknown): value is Does { | ||
return svt.isInterface<Does>(value, {type: HasOptionalConstructorTag.Does, data: svt.optional(svt.isNumber)}); | ||
} | ||
|
||
export function isHasOptionalStruct(value: unknown): value is HasOptionalStruct { | ||
return svt.isInterface<HasOptionalStruct>(value, {type: HasOptionalConstructorTag.HasOptionalStruct, data: svt.optional(isHasOptionalString)}); | ||
} | ||
|
||
export function validateHasOptionalConstructor(value: unknown): svt.ValidationResult<HasOptionalConstructor> { | ||
return svt.validateWithTypeTag<HasOptionalConstructor>(value, {[HasOptionalConstructorTag.DoesNot]: validateDoesNot, [HasOptionalConstructorTag.Does]: validateDoes, [HasOptionalConstructorTag.HasOptionalStruct]: validateHasOptionalStruct}, "type"); | ||
} | ||
|
||
export function validateDoesNot(value: unknown): svt.ValidationResult<DoesNot> { | ||
return svt.validate<DoesNot>(value, {type: HasOptionalConstructorTag.DoesNot, data: svt.validateNumber}); | ||
} | ||
|
||
export function validateDoes(value: unknown): svt.ValidationResult<Does> { | ||
return svt.validate<Does>(value, {type: HasOptionalConstructorTag.Does, data: svt.validateOptional(svt.validateNumber)}); | ||
} | ||
|
||
export function validateHasOptionalStruct(value: unknown): svt.ValidationResult<HasOptionalStruct> { | ||
return svt.validate<HasOptionalStruct>(value, {type: HasOptionalConstructorTag.HasOptionalStruct, data: svt.validateOptional(validateHasOptionalString)}); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
import * as svt from "simple-validation-tools"; | ||
|
||
export type BasicStruct = { | ||
field1: number; | ||
field2: string; | ||
}; | ||
|
||
export function isBasicStruct(value: unknown): value is BasicStruct { | ||
return svt.isInterface<BasicStruct>(value, {field1: svt.isNumber, field2: svt.isString}); | ||
} | ||
|
||
export function validateBasicStruct(value: unknown): svt.ValidationResult<BasicStruct> { | ||
return svt.validate<BasicStruct>(value, {field1: svt.validateNumber, field2: svt.validateString}); | ||
} |
Oops, something went wrong.