我正在用monorepo中的aws-amplify实现一个打字稿项目。 monorepo在packages/web
下有一个Web项目,在packages/models
下有一个模型项目,其中包括graphql操作和类型。创建完我的graphql模式后,我将借助amplify codegen
至packages/models/src/graphql/
到目前为止,在Vue项目中,我可以将操作和类型导入为
import {listOrganizations, ListOrganizationsQuery} from "models";
,执行查询,得到结果。当需要在组件中使用动作时,我会再次从模型中导入类型并使用。
我提出的想法是,是否有一种方法可以从模型项目中导入类型,并将Web项目中的所有类型包含在.d.ts
文件中,以跳过从模型存储库中导入类型。因此,每次生成graphql操作和类型时,我都希望Web repo导入类型并在Web项目中全局声明以能够跳过导入类型。
我尝试过的事情:
在api.d.ts
中创建一个packages/web/src
文件
从packages/models/src/graphql/API.ts
我要在这里做的是从全局导入并声明模型中的所有类型,但现在我被困住了。
程序包/模型/模型/src/graphql/API.ts
export type ListOrganizationsQuery = {
listOrganizations: {
__typename: "ModelOrganizationConnection",
items: Array< {
__typename: "Organization",
id: string,
name: string,
externalId: string | null,
status: OrganizationStatus,
logo: string,
} | null > | null,
nextToken: string | null,
} | null,
};
packages / web / src / api.d.ts
import "models/src/graphql/API.ts";
VSCode是无法识别导入的类型的,并且只要我执行此操作的方法可能不正确,编译器就不会编译。有什么办法可以导入所有类型并进行全局声明?还是我应该应用其他最佳实践,而不是尝试这种方式?
答案 0 :(得分:0)
在尝试了不同的解决方法几天之后,我终于承认了我正在尝试做的事情。全局导入和声明类型的目的是,amplify codegen
为查询,变异和预订创建类型,但没有为模型创建类型。因此,我不得不在前端应用程序中重新编写模型,但是每次更新graphql模式时,我也需要更新前端类型。
我的解决方法是将查询类型从包/模型动态导入到前端项目中的declarations.d.ts
中。并在那里声明类似的模型类型。
示例
packages / models / src / graphql / API.ts
export type GetOrganizationQuery = {
getOrganization: {
__typename: "Organization",
id: string,
name: string,
decription: string | null,
...
};
packages / web / src / types / declarations.d.ts
declare type TOrganization = import("../path/to/models").GetOrganizationQuery["getOrganization"];