Skip to content

Commit 8e286c1

Browse files
Merge pull request #854 from christian98/ts-repro
Support route model binding and interfaces
2 parents fc6d6ca + 1544bd1 commit 8e286c1

File tree

2 files changed

+14
-3
lines changed

2 files changed

+14
-3
lines changed

src/js/index.d.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,15 @@ type ParameterValue = RawParameterValue | DefaultRoutable;
5252
/**
5353
* A parseable route parameter, either plain or nested inside an object under its binding key.
5454
*/
55-
type Routable<I extends ParameterInfo> = I extends { binding: string }
56-
? ({ [K in I['binding']]: RawParameterValue } & Record<keyof any, unknown>) | RawParameterValue
55+
type Routable<I extends ParameterInfo> = I extends { binding: infer B extends string }
56+
?
57+
| { [K in B]: RawParameterValue }
58+
| ({ [K in B]: RawParameterValue } & Record<keyof any, unknown>)
59+
| RawParameterValue
5760
: ParameterValue;
5861

5962
// Uncomment to test:
60-
// type A = Routable<{ name: 'foo', required: true, binding: 'bar' }>;
63+
// type A = Routable<{ name: 'foo'; required: true; binding: 'bar' }>;
6164
// = RawParameterValue | { bar: RawParameterValue }
6265
// type B = Routable<{ name: 'foo', required: true, }>;
6366
// = RawParameterValue | DefaultRoutable

tests/js/route.test-d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,14 @@ assertType(route('posts.comments.show', { comment: { foo: 'bar' } }));
4949
// parameter has an explicit 'uuid' binding, so that's required :)
5050
assertType(route('posts.comments.show', { comment: { id: 2 } }));
5151

52+
// Interfaces
53+
interface Model {
54+
uuid: string;
55+
foo: string;
56+
}
57+
let comment: Model = { uuid: '123', foo: 'bar' };
58+
assertType(route('posts.comments.show', { comment, post: '1' }));
59+
5260
// Plain values
5361
assertType(route('posts.comments.show', 2));
5462
assertType(route('posts.comments.show', 'foo'));

0 commit comments

Comments
 (0)