Skip to content

Commit 3f24c29

Browse files
authored
fix(form-core): any types (#1419)
* fix: any types * chore: remove IsAny
1 parent c6512bd commit 3f24c29

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

packages/form-core/src/util-types.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,6 @@ type Try<A1, A2, Catch = never> = A1 extends A2 ? A1 : Catch
1919
*/
2020
export type Narrow<A> = Try<A, [], NarrowRaw<A>>
2121

22-
type IsAny<T> = 0 extends 1 & T ? true : false
23-
2422
export interface AnyDeepKeyAndValue {
2523
key: string
2624
value: any
@@ -117,15 +115,13 @@ export interface UnknownDeepKeyAndValue<TParent extends AnyDeepKeyAndValue> {
117115
value: unknown
118116
}
119117

120-
export type DeepKeyAndValueUnknown<TParent extends AnyDeepKeyAndValue> =
121-
UnknownDeepKeyAndValue<TParent>
122-
123118
export type DeepKeysAndValues<
124119
T,
125120
TParent extends AnyDeepKeyAndValue = never,
126121
TAcc = never,
127-
> =
128-
IsAny<T> extends true
122+
> = unknown extends T
123+
? TAcc | UnknownDeepKeyAndValue<TParent>
124+
: unknown extends T // this stops runaway recursion when T is any
129125
? T
130126
: T extends string | number | boolean | bigint | Date
131127
? TAcc
@@ -134,7 +130,7 @@ export type DeepKeysAndValues<
134130
? DeepKeyAndValueArray<TParent, T, TAcc>
135131
: DeepKeyAndValueTuple<TParent, T, TAcc>
136132
: keyof T extends never
137-
? TAcc | DeepKeyAndValueUnknown<TParent>
133+
? TAcc | UnknownDeepKeyAndValue<TParent>
138134
: T extends object
139135
? DeepKeyAndValueObject<TParent, T, TAcc>
140136
: TAcc

packages/form-core/tests/util-types.test-d.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,3 +354,30 @@ type Userr = {
354354
}
355355

356356
type UserKeys = DeepValue<Userr, DeepKeys<Userr>>
357+
358+
type ObjectWithAny = {
359+
a: any
360+
b: number
361+
obj: {
362+
c: any
363+
d: number
364+
}
365+
}
366+
367+
type AnyObjectKeys = DeepKeys<ObjectWithAny>
368+
expectTypeOf(0 as never as AnyObjectKeys).toEqualTypeOf<
369+
'a' | 'b' | 'obj' | `a.${string}` | 'obj.c' | `obj.c.${string}` | 'obj.d'
370+
>()
371+
type AnyObjectExample = DeepValue<ObjectWithAny, 'a'>
372+
expectTypeOf(0 as never as AnyObjectExample).toEqualTypeOf<any>()
373+
type AnyObjectExample2 = DeepValue<ObjectWithAny, 'b'>
374+
expectTypeOf(0 as never as AnyObjectExample2).toEqualTypeOf<number>()
375+
type AnyObjectExample3 = DeepValue<ObjectWithAny, 'obj'>
376+
expectTypeOf(0 as never as AnyObjectExample3).toEqualTypeOf<{
377+
c: any
378+
d: number
379+
}>
380+
type AnyObjectExample4 = DeepValue<ObjectWithAny, 'obj.c'>
381+
expectTypeOf(0 as never as AnyObjectExample4).toEqualTypeOf<any>()
382+
type AnyObjectExample5 = DeepValue<ObjectWithAny, 'obj.d'>
383+
expectTypeOf(0 as never as AnyObjectExample5).toEqualTypeOf<number>()

0 commit comments

Comments
 (0)