{"id":47506,"date":"2023-12-12T09:25:06","date_gmt":"2023-11-01T01:39:01","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/"},"modified":"2024-05-04T13:12:44","modified_gmt":"2024-05-04T05:12:44","slug":"%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/","title":{"rendered":"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript)"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u603b\u7ed3\u4e86\u5728\u8fd9\u4e2a\u4ed3\u5e93\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\u3002<\/p>\n<h2>\u5bf9\u4e8e GraphQL + TypeScript \u7684\u6311\u6218\u611f<\/h2>\n<p>\u4f7f\u7528TypeScript\uff08\u4ee5\u53ca\u5176\u4ed6\u9759\u6001\u7c7b\u578b\u8bed\u8a00\uff09\u548cGraphQL\u65f6\uff0c\u5f80\u5f80\u4f1a\u51fa\u73b0\u7c7b\u578b\u7684\u91cd\u590d\u5b9a\u4e49\u95ee\u9898\u3002\u5c3d\u7ba1\u6211\u4eec\u82b1\u4e86\u5f88\u591a\u5fc3\u601d\u5728GraphQL\u4e0a\u7f16\u5199\u901a\u4fe1\u534f\u8bae\u7684\u7c7b\u578b\uff0c\u4f46\u901a\u8fc7\u591a\u91cd\u5b9a\u4e49\u8fd9\u4e9b\u7c7b\u578b\u53ef\u80fd\u4f1a\u589e\u52a0\u8fd0\u7ef4\u7684\u7e41\u7410\u6027\u5e76\u53ef\u80fd\u6210\u4e3a\u9519\u8bef\u7684\u6e29\u5e8a\uff0c\u8fd9\u662f\u4e00\u4e2a\u4ee4\u4eba\u62c5\u5fe7\u7684\u95ee\u9898\u3002<\/p>\n<p>\u672c\u6b21\u65e8\u5728\u7f16\u5199GraphQL\u7684\u6a21\u5f0f\u548c\u67e5\u8be2\uff0c\u4e3a\u670d\u52a1\u5668\u751f\u6210\u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b9a\u4e49\uff0c\u4e3a\u5ba2\u6237\u7aef\u751f\u6210\u67e5\u8be2\u7684\u7c7b\u578b\u5b9a\u4e49\uff0c\u4ee5\u4fbf\u5c3d\u53ef\u80fd\u5730\u5904\u7406\u7c7b\u578b\u5b89\u5168\u7684\u4ee3\u7801\u3002<\/p>\n<h2>\u505a\u6cd5<\/h2>\n<p>\u6211\u4eec\u4f1a\u4f7f\u7528 graphql-code-generator\uff08\u4e3b\u8981\u662f\u4ecb\u7ecd\u8fd9\u4e2a\u5e93\uff09\u3002<\/p>\n<p>\u671f\u5f85\u4e2d\u7684\u76ee\u5f55\u7ed3\u6784\u5c31\u50cf\u8fd9\u6837<\/p>\n<pre class=\"post-pre\"><code>\r\n\u251c\u2500\u2500 graphql\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 mutations\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 addUser.graphql\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 deleteUser.graphql\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 queries\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 user.graphql\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 users.graphql\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 schema.graphql\r\n\u251c\u2500\u2500 client\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 index.html\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 main.tsx\r\n\u251c\u2500\u2500 server\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 index.ts\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 package.json\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 resolvers.ts\r\n\u2514\u2500\u2500 codegen.yml\r\n\r\n<\/code><\/pre>\n<p>\u867d\u7136\u6709\u70b9\u51cc\u4e71\uff0c\u4f46\u662f<\/p>\n<p>GraphQL \u901a\u8fc7\u5b9a\u4e49\u6a21\u5f0f<br \/>\n\u5ba2\u6237\u7aef \u5b9e\u73b0\u5ba2\u6237\u7aef<br \/>\n\u670d\u52a1\u5668 \u5b9e\u73b0GraphQL\u670d\u52a1\u5668<\/p>\n<p>\u662f\u7684\u3002<\/p>\n<h2>\u751f\u6210\u6570\u636e\u6a21\u578b<\/h2>\n<p>\u5047\u8bbe\u6211\u4eec\u5728 server\/gen \u76ee\u5f55\u4e2d\u5b9a\u4e49\u4e86 GraphQL \u89e3\u6790\u5668\u7684\u7c7b\u578b\uff0c\u5e76\u5728 client\/gen \u76ee\u5f55\u4e2d\u751f\u6210\u4e86\u7528\u4e8e GraphQL \u67e5\u8be2\u548c\u53d8\u66f4\u7684 hooks API\u3002<\/p>\n<p>\u8fd9\u4e2a\u8f6f\u4ef6\u5305\u6709\u5f88\u591a\u96f6\u6563\u7684\u90e8\u5206\uff0c\u4f9d\u8d56\u9879\u4e5f\u76f8\u5f53\u591a\uff0c\u4f46\u6211\u4eec\u4f1a\u5b89\u88c5\u8fd9\u4e9b\u7ec4\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>yarn add -D @graphql-codegen\/cli @graphql-codegen\/introspection @graphql-codegen\/typescript @graphql-codegen\/typescript-operations @graphql-codegen\/typescript-resolvers @graphql-codegen\/typescript-react-apollo\r\n<\/code><\/pre>\n<p>\u6211\u5199\u4e86\u4e00\u4e2a\u7c7b\u4f3c\u4ee5\u4e0b\u7684 codegen.yml\uff0c\u5c3d\u7ba1\u53ef\u4ee5\u7528 yarn graphql-codegen init \u6765\u751f\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">overwrite<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n<span class=\"na\">schema<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"s\">.\/graphql\/schema.graphql<\/span>\r\n<span class=\"na\">documents<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"s\">.\/graphql\/queries\/*.graphql<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"s\">.\/graphql\/mutations\/*.graphql<\/span>\r\n<span class=\"na\">generates<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"s\">.\/server\/gen\/graphql-resolver-types.ts<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">plugins<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript-resolvers<\/span>\r\n  <span class=\"s\">.\/client\/gen\/graphql-client-api.tsx<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">plugins<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript-operations<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">typescript-react-apollo<\/span>\r\n    <span class=\"na\">config<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">withComponent<\/span><span class=\"pi\">:<\/span> <span class=\"no\">false<\/span>\r\n      <span class=\"na\">withHooks<\/span><span class=\"pi\">:<\/span> <span class=\"no\">true<\/span>\r\n      <span class=\"na\">withHOC<\/span><span class=\"pi\">:<\/span> <span class=\"no\">false<\/span>\r\n  <span class=\"s\">.\/graphql\/schema.json<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">plugins<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">introspection<\/span>\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">typescript-resolver \u3092\u4f7f\u3063\u305f\u30ea\u30be\u30eb\u30d0\u7528\u578b\u5b9a\u7fa9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">typescript-react-apollo \u3092\u4f7f\u3063\u305f React \u5411\u3051\u578b\u5b9a\u7fa9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">schema.json<\/ul>\n<p>\u6211\u6253\u7b97\u5410\u51fa\u6765\u3002<\/p>\n<p>\u901a\u8fc7 Yarn \u6267\u884c\u547d\u4ee4\u6765\u751f\u6210\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code>$ yarn graphql-codegen --config codegen.yml\r\n  \u2714 Parse configuration\r\n  \u2714 Generate outputs\r\n<\/code><\/pre>\n<p>\u6211\u5011\u5c07\u5728\u4f7f\u7528\u904e\u7a0b\u4e2d\u9032\u884c\u751f\u6210\u4ee3\u78bc\u7684\u78ba\u8a8d\u3002<\/p>\n<h2>\u670d\u52a1\u5668\u7aef\u89e3\u6790\u5668\u7684\u7c7b\u578b\u5b9a\u4e49<\/h2>\n<p>\u8fd9\u662f\u4e00\u4e2a\u4f7f\u7528typeorm\u7684\u7b80\u5355CRUD\u793a\u4f8b\u3002\uff08\u5176\u5b9e\u5766\u7387\u5730\u8bf4\uff0c\u8fd9\u4e2a\u4ed3\u5e93\u662f\u7528\u6765\u7ec3\u4e60typeorm\u7684\uff09<\/p>\n<p>\u901a\u8fc7\u751f\u6210\u7684\u7c7b\u578b\u5b9a\u4e49\uff0c\u6211\u4eec\u53ef\u4ee5\u83b7\u5f97MutationResolvers\u548cQueryResolvers\uff0c\u4ece\u800c\u53ef\u4ee5\u5728\u89e3\u6790\u5668\u7684\u5b9e\u73b0\u4e2d\u4e3a\u5176\u6dfb\u52a0\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ulid<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">ulid<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">MutationResolvers<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">QueryResolvers<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">Resolvers<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/gen\/graphql-resolver-types<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">User<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/entity\/User<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Query<\/span><span class=\"p\">:<\/span> <span class=\"nx\">QueryResolvers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">user<\/span><span class=\"p\">(<\/span><span class=\"nx\">_parent<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_info<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">User<\/span><span class=\"p\">.<\/span><span class=\"nx\">findOne<\/span><span class=\"p\">({<\/span> <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">args<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">});<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">user<\/span> <span class=\"o\">||<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">users<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">users<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">User<\/span><span class=\"p\">.<\/span><span class=\"nx\">find<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">users<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">},<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">Mutation<\/span><span class=\"p\">:<\/span> <span class=\"nx\">MutationResolvers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">addUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">_parent<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_info<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">newUser<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">User<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"nx\">newUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">ulid<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"nx\">newUser<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">args<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"k\">await<\/span> <span class=\"nx\">User<\/span><span class=\"p\">.<\/span><span class=\"nx\">save<\/span><span class=\"p\">(<\/span><span class=\"nx\">newUser<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">newUser<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">},<\/span>\r\n  <span class=\"k\">async<\/span> <span class=\"nx\">deleteUser<\/span><span class=\"p\">(<\/span><span class=\"nx\">_parent<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">_info<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"nx\">user<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">User<\/span><span class=\"p\">.<\/span><span class=\"nx\">findOne<\/span><span class=\"p\">(<\/span><span class=\"nx\">args<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">await<\/span> <span class=\"nx\">User<\/span><span class=\"p\">.<\/span><span class=\"k\">delete<\/span><span class=\"p\">(<\/span><span class=\"nx\">args<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nx\">user<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"p\">},<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">resolvers<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Resolvers<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">Query<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">Mutation<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u8981\u4f7f\u7528VSCode\u7b49\u8f6f\u4ef6\u8fdb\u884c\u64cd\u4f5c\u5c31\u80fd\u660e\u767d\uff0c\u7b2c\u4e8c\u4e2a\u53c2\u6570args\u9700\u8981\u6307\u5b9a\u7c7b\u578b\uff0c\u5e76\u4e14\u8fd4\u56de\u503c\u4e5f\u9700\u8981\u6307\u5b9a\u7c7b\u578b\u3002<\/p>\n<p>\u4ece\u67e5\u770b\u751f\u6210\u7684\u4ee3\u7801\uff0c\u53ef\u4ee5\u770b\u5230\u4ee5\u4e0b\u4ee3\u7801\u751f\u6210\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"c1\">\/\/...<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">MutationResolvers<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Context<\/span> <span class=\"o\">=<\/span> <span class=\"kr\">any<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Mutation<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">addUser<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Resolver<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">User<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">MutationAddUserArgs<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">deleteUser<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Resolver<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">User<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">MutationDeleteUserArgs<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">QueryResolvers<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Context<\/span> <span class=\"o\">=<\/span> <span class=\"kr\">any<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">Query<\/span><span class=\"o\">&gt;<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">user<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Resolver<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Maybe<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">User<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Context<\/span><span class=\"p\">,<\/span> <span class=\"nx\">QueryUserArgs<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">users<\/span><span class=\"p\">?:<\/span> <span class=\"nx\">Resolver<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Maybe<\/span><span class=\"o\">&lt;<\/span><span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">User<\/span><span class=\"o\">&gt;&gt;<\/span><span class=\"p\">,<\/span> <span class=\"nx\">ParentType<\/span><span class=\"p\">,<\/span> <span class=\"nx\">Context<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u73b0\u5728\u53ef\u4ee5\u653e\u5fc3\u5730\u64b0\u5199\u89e3\u51b3\u65b9\u6848\u4e86\u3002<\/p>\n<h2>\u4f7f\u7528\u5ba2\u6237\u7aef\u751f\u6210\u7684\u4ee3\u7801<\/h2>\n<p>\u5047\u8bbe\u60a8\u5df2\u7ecf\u5728 http:\/\/localhost:3333 \u4e0a\u8fd0\u884c\u4e86\u4e00\u4e2a\u901a\u8fc7\u2191\u521b\u5efa\u7684 GraphQL \u670d\u52a1\u5668\u3002<br \/>\n\u5404\u79cd\u8bbe\u7f6e\u5df2\u88ab\u7701\u7565\uff0c\u8bf7\u53c2\u9605\u5b58\u50a8\u5e93\u3002\u4e3a\u4e86\u7b80\u5316\uff0c\u6211\u4eec\u4f7f\u7528\u4e86parcel\u3002<\/p>\n<p>\u8bf7\u5173\u6ce8\u5982\u4f55\u4f7f\u7528\u751f\u6210\u7684\u4ee3\u7801\uff0c\u7279\u522b\u662f\u5c06`import &#8230; from &#8216;.\/gen\/graphql-client-api&#8217;`\u4ee3\u7801\u548c`UserList`\u7684\u94a9\u5b50\u51fd\u6570\u914d\u5408\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">ReactDOM<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-dom<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApolloClient<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">apollo-client<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createHttpLink<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">apollo-link-http<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">InMemoryCache<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">apollo-cache-inmemory<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApolloProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-apollo<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">ApolloProvider<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">ApolloHooksProvider<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">react-apollo-hooks<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">useUsersQuery<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">useAddUserMutation<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">useDeleteUserMutation<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/gen\/graphql-client-api<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">ApolloClient<\/span><span class=\"p\">({<\/span>\r\n  <span class=\"na\">link<\/span><span class=\"p\">:<\/span> <span class=\"nx\">createHttpLink<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">uri<\/span><span class=\"p\">:<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">http:\/\/localhost:3333\/graphql<\/span><span class=\"dl\">'<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">}),<\/span>\r\n  <span class=\"na\">cache<\/span><span class=\"p\">:<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">InMemoryCache<\/span><span class=\"p\">(),<\/span>\r\n<span class=\"p\">});<\/span>\r\n\r\n\r\n<span class=\"kd\">function<\/span> <span class=\"nx\">UserList<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">usersQuery<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useUsersQuery<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">addUserMutation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useAddUserMutation<\/span><span class=\"p\">();<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">deleteUserMutation<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useDeleteUserMutation<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">h1<\/span><span class=\"o\">&gt;<\/span><span class=\"nx\">Users<\/span><span class=\"o\">&lt;<\/span><span class=\"sr\">\/h1<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"nx\">ul<\/span><span class=\"o\">&gt;<\/span>\r\n        <span class=\"p\">{<\/span><span class=\"o\">!<\/span><span class=\"nx\">usersQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">loading<\/span> <span class=\"o\">&amp;&amp;<\/span>\r\n          <span class=\"nx\">usersQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">users<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">user<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n              <span class=\"o\">&lt;<\/span><span class=\"nx\">li<\/span> <span class=\"nx\">key<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n                <span class=\"p\">{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"p\">}:{<\/span><span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">name<\/span><span class=\"p\">}<\/span>\r\n                <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span>\r\n                  <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n                    <span class=\"k\">await<\/span> <span class=\"nx\">deleteUserMutation<\/span><span class=\"p\">({<\/span> <span class=\"na\">variables<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"nx\">user<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span> <span class=\"p\">}<\/span> <span class=\"p\">});<\/span>\r\n                    <span class=\"nx\">usersQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">refetch<\/span><span class=\"p\">();<\/span>\r\n                  <span class=\"p\">}}<\/span>\r\n                <span class=\"o\">&gt;<\/span>\r\n                  <span class=\"k\">delete<\/span>\r\n                <span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>              <span class=\"o\">&lt;<\/span><span class=\"sr\">\/li<\/span><span class=\"err\">&gt;\r\n<\/span>            <span class=\"p\">);<\/span>\r\n          <span class=\"p\">})}<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/ul<\/span><span class=\"err\">&gt;\r\n<\/span>      <span class=\"o\">&lt;<\/span><span class=\"nx\">button<\/span>\r\n        <span class=\"nx\">onClick<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"k\">async<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"k\">await<\/span> <span class=\"nx\">addUserMutation<\/span><span class=\"p\">({<\/span>\r\n            <span class=\"na\">variables<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">name<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Math<\/span><span class=\"p\">.<\/span><span class=\"nx\">random<\/span><span class=\"p\">().<\/span><span class=\"nx\">toString<\/span><span class=\"p\">()<\/span> <span class=\"p\">},<\/span>\r\n          <span class=\"p\">});<\/span>\r\n          <span class=\"nx\">usersQuery<\/span><span class=\"p\">.<\/span><span class=\"nx\">refetch<\/span><span class=\"p\">();<\/span>\r\n        <span class=\"p\">}}<\/span>\r\n      <span class=\"o\">&gt;<\/span>\r\n        <span class=\"nx\">addUser<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/button<\/span><span class=\"err\">&gt;\r\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"kd\">function<\/span> <span class=\"nx\">App<\/span><span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"nx\">ApolloProvider<\/span> <span class=\"nx\">client<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">client<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"nx\">ApolloHooksProvider<\/span> <span class=\"nx\">client<\/span><span class=\"o\">=<\/span><span class=\"p\">{<\/span><span class=\"nx\">client<\/span><span class=\"p\">}<\/span><span class=\"o\">&gt;<\/span>\r\n        <span class=\"o\">&lt;<\/span><span class=\"nx\">UserList<\/span> <span class=\"o\">\/&gt;<\/span>\r\n      <span class=\"o\">&lt;<\/span><span class=\"sr\">\/ApolloHooksProvider<\/span><span class=\"err\">&gt;\r\n<\/span>    <span class=\"o\">&lt;<\/span><span class=\"sr\">\/ApolloProvider<\/span><span class=\"err\">&gt;\r\n<\/span>  <span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<span class=\"nx\">ReactDOM<\/span><span class=\"p\">.<\/span><span class=\"nx\">render<\/span><span class=\"p\">(<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">App<\/span> <span class=\"o\">\/&gt;<\/span><span class=\"p\">,<\/span> <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">querySelector<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">.root<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span>\r\n<\/code><\/pre>\n<p>\u5982\u679c\u51fa\u73b0\u526f\u4f5c\u7528\uff0c\u7528\u6237\u5e94\u8be5\u8c03\u7528usersQuery.refetch()\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d7f80913a08637a6a6a7f\/37-0.gif\" alt=\"\" \/><\/div>\n<h2>\u5370\u8c61<\/h2>\n<p>\u901a\u8fc7\u4ece\u6a21\u5f0f\u751f\u6210\u4ee3\u7801\uff0c\u6211\u80fd\u591f\u6700\u5c0f\u5316\u81ea\u5df1\u5b9a\u4e49\u7684\u90e8\u5206\uff0c\u5e76\u4e14\u80fd\u591f\u6709\u6548\u5730\u8fdb\u884cTypeScript\u7684\u7c7b\u578b\u68c0\u67e5\u3002<\/p>\n<p>\u901a\u8fc7\u4f7f\u7528GraphQL\u548c\u7c7b\u578b\uff0c\u6211\u611f\u89c9\u5230\u6574\u4f53\u4e0a\u4e0d\u518d\u90a3\u4e48\u6d6a\u8d39\uff0c\u8fd9\u4f7f\u5f97\u6574\u4e2a\u8fc7\u7a0b\u53d8\u5f97\u66f4\u52a0\u8f7b\u677e\uff0c\u6211\u7ec8\u4e8e\u6709\u4e86\u6295\u5165\u751f\u4ea7\u73af\u5883\u7684\u52a8\u529b\u3002<\/p>\n<p>\u5728\u4e25\u683c\u610f\u4e49\u4e0a\uff0ctypeorm\u548cGraphQL\u4e4b\u95f4\u4ecd\u7136\u5b58\u5728\u4e00\u4e9b\u7c7b\u4f3c\u91cd\u590d\u5b9a\u4e49\u7684\u90e8\u5206\uff0c\u4f46\u8003\u8651\u5230GraphQL\u5e76\u4e0d\u662fORM\u7684\u7279\u70b9\uff0c\u6211\u8ba4\u4e3a\u4fdd\u6301\u5b83\u4eec\u5206\u79bb\u662f\u66f4\u597d\u7684\u9009\u62e9\u3002<\/p>\n<p>\u5982\u679c\u60f3\u5c06GraphQL\u7528\u4f5cORM\uff0c\u4f7f\u7528Prisma\u4f1a\u66f4\u65b9\u4fbf\u3002<\/p>\n<p>Prisma &#8211; \u6700\u5feb\u7684 GraphQL \u670d\u52a1\u5668\u5b9e\u73b0 &#8211; Qiita<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u603b\u7ed3\u4e86\u5728\u8fd9\u4e2a\u4ed3\u5e93\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\u3002 \u5bf9\u4e8e GraphQL + TypeScript \u7684\u6311\u6218\u611f \u4f7f\u7528Type [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47506","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript) - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7528-graphql-codegen-\u751f\u6210\u7c7b\u578b\u5b9a\u4e49-react-apollo-typescript\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript)\" \/>\n<meta property=\"og:description\" content=\"\u8fd9\u7bc7\u6587\u7ae0\u603b\u7ed3\u4e86\u5728\u8fd9\u4e2a\u4ed3\u5e93\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\u3002 \u5bf9\u4e8e GraphQL + TypeScript \u7684\u6311\u6218\u611f \u4f7f\u7528Type [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u7528-graphql-codegen-\u751f\u6210\u7c7b\u578b\u5b9a\u4e49-react-apollo-typescript\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-01T01:39:01+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T05:12:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d7f80913a08637a6a6a7f\/37-0.gif\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/\",\"name\":\"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript) - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-11-01T01:39:01+00:00\",\"dateModified\":\"2024-05-04T05:12:44+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript) - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u7528-graphql-codegen-\u751f\u6210\u7c7b\u578b\u5b9a\u4e49-react-apollo-typescript\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript)","og_description":"\u8fd9\u7bc7\u6587\u7ae0\u603b\u7ed3\u4e86\u5728\u8fd9\u4e2a\u4ed3\u5e93\u4e2d\u6240\u505a\u7684\u4e8b\u60c5\u3002 \u5bf9\u4e8e GraphQL + TypeScript \u7684\u6311\u6218\u611f \u4f7f\u7528Type [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u7528-graphql-codegen-\u751f\u6210\u7c7b\u578b\u5b9a\u4e49-react-apollo-typescript\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-11-01T01:39:01+00:00","article_modified_time":"2024-05-04T05:12:44+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d7f80913a08637a6a6a7f\/37-0.gif"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"2 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/","name":"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript) - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-11-01T01:39:01+00:00","dateModified":"2024-05-04T05:12:44+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u7528 graphql-codegen \u751f\u6210\u7c7b\u578b\u5b9a\u4e49 (React, Apollo, TypeScript)"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e7%94%a8-graphql-codegen-%e7%94%9f%e6%88%90%e7%b1%bb%e5%9e%8b%e5%ae%9a%e4%b9%89-react-apollo-typescript%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47506","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47506"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47506\/revisions"}],"predecessor-version":[{"id":98525,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47506\/revisions\/98525"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47506"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47506"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47506"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}