Skip to content

Define 辅助函数可用于减少您必须自己输入的类型数量。它们完全是可选的,因为一些开发者喜欢类型的显式性,另一些则喜欢 define.* 辅助函数的便利性。

不使用 define 辅助函数:

ts
export interface State {
  foo: string;
}
ts
import type { State } from "./util.ts";

export async function myMiddleware(ctx: Context<State>): Promise<Response> {
  return new Response("hello " + ctx.state.foo);
}

export async function otherMiddleware(ctx: Context<State>): Promise<Response> {
  return new Response("other " + ctx.state.foo);
}

使用 define 辅助函数:

ts
import { createDefine } from "fresh";

// 设置,在一个文件中执行一次,然后在其他地方导入它。
export const define = createDefine<{ foo: string }>();
ts
import { define } from "./util.ts";

// 使用
export const myMiddleware = define.middleware((ctx) => {
  return new Response("hello " + ctx.state.foo);
});

export const otherMiddleware = define.middleware((ctx) => {
  return new Response("other " + ctx.state.foo);
});

文件路由

define.* 辅助函数包括 define.handler()define.page() 函数,以便 TypeScript 可以轻松地在两者之间建立关系。这样您可以以类型安全的方式将数据从处理器传递到组件。

tsx
export const handler = define.handlers({
  GET(ctx) {
    return { data: { foo: "Deno" } };
  },
});

// 当您输入 `props.data.*` 时,您将获得自动补全
export default define.page<typeof handler>((props) => {
  return (
    <div>
      <h1>I like {props.data.foo}</h1>
    </div>
  );
});

还有一个用于 布局define.layout() 辅助函数:

tsx
export default define.layout((props) => {
  return (
    <div>
      <h1>I like {props.state.foo}</h1>
    </div>
  );
});