Skip to content

Commit 0efb3f6

Browse files
mmalerbathePunderWoman
authored andcommitted
refactor(forms): nicer type errors
By intersecting with `object` instead of `unknown` in the primitive and `FormControl` cases, we get TypeScript to show nicer type errors that mention `FieldTree<...>` insetad of `() => FieldState<...>`
1 parent c74367c commit 0efb3f6

File tree

3 files changed

+8
-8
lines changed

3 files changed

+8
-8
lines changed

goldens/public-api/forms/signals/index.api.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ export interface FieldState<TValue, TKey extends string | number = string | numb
181181
}
182182

183183
// @public
184-
export type FieldTree<TModel, TKey extends string | number = string | number> = (() => [TModel] extends [AbstractControl] ? CompatFieldState<TModel, TKey> : FieldState<TModel, TKey>) & ([TModel] extends [AbstractControl] ? unknown : [TModel] extends [Array<infer U>] ? ReadonlyArrayLike<MaybeFieldTree<U, number>> : TModel extends Record<string, any> ? Subfields<TModel> : unknown);
184+
export type FieldTree<TModel, TKey extends string | number = string | number> = (() => [TModel] extends [AbstractControl] ? CompatFieldState<TModel, TKey> : FieldState<TModel, TKey>) & ([TModel] extends [AbstractControl] ? object : [TModel] extends [Array<infer U>] ? ReadonlyArrayLike<MaybeFieldTree<U, number>> : TModel extends Record<string, any> ? Subfields<TModel> : object);
185185

186186
// @public
187187
export type FieldValidator<TValue, TPathKind extends PathKind = PathKind.Root> = LogicFn<TValue, ValidationResult<ValidationError.WithoutField>, TPathKind>;

packages/compiler-cli/test/ngtsc/signal_forms_spec.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
* found in the LICENSE file at https://angular.dev/license
77
*/
88

9+
import ts from 'typescript';
910
import {runInEachFileSystem} from '../../src/ngtsc/file_system/testing';
1011
import {loadStandardTestFiles} from '../../src/ngtsc/testing';
1112
import {NgtscTestEnvironment} from './env';
12-
import ts from 'typescript';
1313

1414
const testFiles = loadStandardTestFiles({forms: true});
1515

@@ -44,7 +44,7 @@ runInEachFileSystem(() => {
4444
const diags = env.driveDiagnostics();
4545
expect(diags.length).toBe(1);
4646
expect(extractMessage(diags[0])).toBe(
47-
`Type 'null' is not assignable to type '() => FieldState<string, string | number>'.`,
47+
`Type 'null' is not assignable to type 'FieldTree<string, string | number>'.`,
4848
);
4949
});
5050

@@ -100,7 +100,7 @@ runInEachFileSystem(() => {
100100
const diags = env.driveDiagnostics();
101101
expect(diags.length).toBe(1);
102102
expect(extractMessage(diags[0])).toBe(
103-
`Type '() => FieldState<number, string | number>' is not assignable to type '() => FieldState<string, string | number>'.`,
103+
`Type 'FieldTree<number, string | number>' is not assignable to type 'FieldTree<string, string | number>'.`,
104104
);
105105
});
106106

@@ -124,7 +124,7 @@ runInEachFileSystem(() => {
124124
const diags = env.driveDiagnostics();
125125
expect(diags.length).toBe(1);
126126
expect(extractMessage(diags[0])).toBe(
127-
`Type '() => FieldState<unknown, string | number>' is not assignable to type '() => FieldState<string | number | Date | null, string | number>'.`,
127+
`Type 'FieldTree<unknown, string | number>' is not assignable to type 'FieldTree<string | number | Date | null, string | number>'.`,
128128
);
129129
});
130130

@@ -187,7 +187,7 @@ runInEachFileSystem(() => {
187187
const diags = env.driveDiagnostics();
188188
expect(diags.length).toBe(1);
189189
expect(extractMessage(diags[0])).toBe(
190-
`Type '() => FieldState<string, string | number>' is not assignable to type '() => FieldState<boolean, string | number>'.`,
190+
`Type 'FieldTree<string, string | number>' is not assignable to type 'FieldTree<boolean, string | number>'.`,
191191
);
192192
});
193193

packages/forms/signals/src/api/types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,12 +168,12 @@ export type FieldTree<TModel, TKey extends string | number = string | number> =
168168
: FieldState<TModel, TKey>) &
169169
// Children:
170170
([TModel] extends [AbstractControl]
171-
? unknown
171+
? object
172172
: [TModel] extends [Array<infer U>]
173173
? ReadonlyArrayLike<MaybeFieldTree<U, number>>
174174
: TModel extends Record<string, any>
175175
? Subfields<TModel>
176-
: unknown);
176+
: object);
177177

178178
/**
179179
* The sub-fields that a user can navigate to from a `FieldTree<TModel>`.

0 commit comments

Comments
 (0)