我想将“元数据”嵌入到类型中,以用于创建类型安全的REST客户端。想法是使用链接中的类型元数据来推断用于API调用的正确端点模式。例如。
type Schema = {
users: {
GET: {
query: { userId: string };
};
};
posts: {
POST: {};
};
};
type User = {
self: Link<"users">;
};
const user: User = { self: "https://..." };
http(user.self,"GET",{ userId: 1 });
我能够使用强力条件类型进行此操作。
例如
type Routes = "users" | "posts";
type Verbs<R> = R extends "users" ? "GET" : never;
type Query<R,V> = R extends "users"
? V extends "GET"
? { queryId: string }
: never
: never;
但是,这导致归一化类型模型难以手动输入。相反,我想使用非规范化的类型,例如。
type Schema = {
users: {
GET: {
query: { userId: string };
};
};
posts: {
POST: {};
};
};
使用如下类型:
type Query<
S,RN extends keyof S,VN extends keyof S[RN]
> = OpQuery<S[RN][VN]>;
除了最后一位和关键位,我能够完成大部分工作,并从链接类型推断出路由名称:
type Schema = {
users: {
GET: {
query: { userId: string };
};
};
posts: {
POST: {};
};
};
type Link<R extends keyof Schema> = string;
type LinkRouteName<L> = L extends Link<infer R> ? R : never;
type name = LinkRouteName<Link<"users">>;
预期:名称===“用户”
实际:名称===“用户” | “帖子”