Skip to content
This repository was archived by the owner on May 11, 2021. It is now read-only.

Commit 3cc65ca

Browse files
committed
Use type alias to simplify the conditional type
1 parent 95d80f2 commit 3cc65ca

File tree

2 files changed

+40
-11
lines changed

2 files changed

+40
-11
lines changed

src/index.ts

+9-11
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ export type ValidatedType<
1818
: O extends ObjectShape<O>
1919
? MapObjectShape<O> | undefined
2020
: O extends Array<infer U>
21-
? U extends ObjectShape<T>
22-
? Array<{ [key in keyof U]: ValidatedType<U[key]> }> | undefined
21+
? U extends ObjectShape<U>
22+
? Array<MapObjectShape<U>> | undefined
2323
: unknown
2424
: unknown
2525
: T extends 'unknown'
@@ -36,17 +36,17 @@ export type ValidatedType<
3636
? number[]
3737
: T extends Array<'boolean'>
3838
? boolean[]
39-
: T extends ObjectShape<object>
40-
? { [key in keyof T]: ValidatedType<T[key]> }
39+
: T extends ObjectShape<T>
40+
? MapObjectShape<T>
4141
: T extends Array<infer U>
42-
? U extends ObjectShape<object>
43-
? Array<{ [key in keyof U]: ValidatedType<U[key]> }>
42+
? U extends ObjectShape<U>
43+
? Array<MapObjectShape<U>>
4444
: unknown
4545
: unknown
4646

47-
type MapObjectShape<T extends ObjectShape<T>> =
48-
| { [key in keyof T]: ValidatedType<T[key]> }
49-
| undefined
47+
type MapObjectShape<T extends ObjectShape<T>> = {
48+
[key in keyof T]: ValidatedType<T[key]>
49+
}
5050

5151
export interface ValidationOptions {
5252
/**
@@ -89,8 +89,6 @@ export const validationTypes = {
8989
}
9090

9191
// We need this generic type so we can merge ObjectShapes and not lose info
92-
// eslint-disable-next-line @typescript-eslint/ban-ts-ignore
93-
// @ts-ignore
9492
export type ObjectShape<T extends {}> = {
9593
[key in keyof T]: ValidationKeyType<T[key]> | OptionalShape<T[key]>
9694
}

test-d/index.test-d.ts

+31
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,34 @@ const nestedResult = validateObjectShape(
7979
if (nestedResult.valid) {
8080
expectType<NestedResultType>(nestedResult.result)
8181
}
82+
83+
interface NestedArrayResultType {
84+
nested: Array<{
85+
one: string
86+
}>
87+
optional:
88+
| Array<{
89+
one: string
90+
}>
91+
| undefined
92+
}
93+
const objectArray = validateObjectShape(
94+
'Test obj',
95+
{
96+
nested: [{ one: 'one' }]
97+
},
98+
{
99+
nested: arrayOf({
100+
one: 'string'
101+
}),
102+
optional: optional(
103+
arrayOf({
104+
one: 'string'
105+
})
106+
)
107+
}
108+
)
109+
110+
if (objectArray.valid) {
111+
expectType<NestedArrayResultType>(objectArray.result)
112+
}

0 commit comments

Comments
 (0)