Skip to content

Commit 27e407a

Browse files
feat: add define.layout helper (#3198)
1 parent f35338b commit 27e407a

2 files changed

Lines changed: 31 additions & 0 deletions

File tree

docs/canary/advanced/define.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,3 +71,15 @@ export default define.page<typeof handler>((props) => {
7171
);
7272
});
7373
```
74+
75+
There is also a `define.layout()` helper for layouts:
76+
77+
```tsx
78+
export default define.layout((props) => {
79+
return (
80+
<div>
81+
<h1>I like {props.state.foo}</h1>
82+
</div>
83+
);
84+
});
85+
```

src/define.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,22 @@ export interface Define<State> {
136136
middleware<M extends Middleware<State> | Middleware<State>[]>(
137137
middleware: M,
138138
): typeof middleware;
139+
/**
140+
* Define a layout component. This function returns the passed input as-is.
141+
*
142+
* You can use this function to help the TypeScript compiler infer the types
143+
* of `props` that your component receives. For example:
144+
*
145+
* ```ts
146+
* import { define } from "../utils.ts";
147+
*
148+
* export default define.layout((props) => {
149+
* const slug = props.params.slug; // Because props is inferred to be a Context object, slug is inferred to be a string
150+
* return <h1>{slug}</h1>;
151+
* });
152+
* ```
153+
*/
154+
layout(render: AnyComponent<PageProps<unknown, State>>): typeof render;
139155
}
140156

141157
/**
@@ -159,6 +175,9 @@ export function createDefine<State>(): Define<State> {
159175
page(render) {
160176
return render;
161177
},
178+
layout(render) {
179+
return render;
180+
},
162181
middleware(middleware) {
163182
return middleware;
164183
},

0 commit comments

Comments
 (0)