从Typescript项目

时间:2019-11-05 17:06:36

标签: typescript graphql typescript-typings aws-amplify monorepo

我正在用monorepo中的aws-amplify实现一个打字稿项目。 monorepo在packages/web下有一个Web项目,在packages/models下有一个模型项目,其中包括graphql操作和类型。创建完我的graphql模式后,我将借助amplify codegenpackages/models/src/graphql/

生成操作和类型。

到目前为止,在Vue项目中,我可以将操作和类型导入为 import {listOrganizations, ListOrganizationsQuery} from "models";,执行查询,得到结果。当需要在组件中使用动作时,我会再次从模型中导入类型并使用。

我提出的想法是,是否有一种方法可以从模型项目中导入类型,并将Web项目中的所有类型包含在.d.ts文件中,以跳过从模型存储库中导入类型。因此,每次生成graphql操作和类型时,我都希望Web repo导入类型并在Web项目中全局声明以能够跳过导入类型。

我尝试过的事情:

  1. api.d.ts中创建一个packages/web/src文件

  2. packages/models/src/graphql/API.ts

  3. 导入类型

我要在这里做的是从全局导入并声明模型中的所有类型,但现在我被困住了。

程序包/模型/模型/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是无法识别导入的类型的,并且只要我执行此操作的方法可能不正确,编译器就不会编译。有什么办法可以导入所有类型并进行全局声明?还是我应该应用其他最佳实践,而不是尝试这种方式?

1 个答案:

答案 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"];