{"id":47920,"date":"2023-03-26T07:48:39","date_gmt":"2024-01-24T08:42:25","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/"},"modified":"2024-04-29T20:36:36","modified_gmt":"2024-04-29T12:36:36","slug":"%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","title":{"rendered":"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f"},"content":{"rendered":"<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8219913a08637a6aedfa\/0-0.png\" alt=\"amplify_react_ts.png\" \/><\/div>\n<p>\u6211\u53d7[&#8220;\u3010\u7206\u901f\u3011React+Amplify+AppSync\u3067\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u63b2\u793a\u677f\u30a2\u30d7\u30ea\u309215\u5206\u3067\u4f5c\u308a\u4e0a\u3052\u308b\u3000\u301c\u3053\u308c\u304c\u6700\u9ad8\u306eDeveloper Experience\u3060\u301c &#8211; Qiita&#8221;]\u9019\u7bc7\u6587\u7ae0\u7684\u555f\u767c\u53bb\u5275\u4f5c\u3002<\/p>\n<p>\u7531\u4e8e\u5728Amplify\u547d\u4ee4\u4e2d\u53ef\u4ee5\u9009\u62e9TypeScript\u6765\u81ea\u52a8\u751f\u6210\u4ee3\u7801\uff0c\u6211\u8bd5\u7740\u770b\u770b\u5b83\u662f\u4ec0\u4e48\u6837\u7684\u3002<br \/>\n\u987a\u4fbf\u4e00\u63d0\uff0c\u6211\u4e5f\u5728\u4f7f\u7528React\u7684Hooks\u3002<\/p>\n<h2>\u7248\u672c<\/h2>\n<p>\u6211\u4f7f\u7528\u7684\u73af\u5883\u5982\u4e0b\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>create-react-app <span class=\"nt\">--version<\/span>\r\n3.0.1\r\n<span class=\"nv\">$ <\/span>node <span class=\"nt\">-v<\/span>\r\nv8.15.1\r\n<span class=\"nv\">$ <\/span>npm <span class=\"nt\">-v<\/span>\r\n6.9.0\r\n<span class=\"nv\">$ <\/span>amplify <span class=\"nt\">--version<\/span>\r\n1.7.0\r\n<\/code><\/pre>\n<p>\u7531\u4e8e\u6211\u7684\u73af\u5883\u4e2d\u751a\u81f3\u6ca1\u6709amplify\u547d\u4ee4\uff0c\u56e0\u6b64\u6211\u67e5\u770b\u4e86\u5b98\u65b9\u9875\u9762\u5e76\u8fdb\u884c\u4e86\u5b89\u88c5\u3002<\/p>\n<p>\u5f00\u59cb \u00b7 \u521b\u5efaReact App<\/p>\n<h2>\u521b\u5efaReact\u5e94\u7528\u7a0b\u5e8f\u7684\u6a21\u677f<\/h2>\n<p>\u4f7f\u7528 create-react-app \u547d\u4ee4\u6dfb\u52a0\u53c2\u6570 &#8211;typescript \u521b\u5efa\u5e94\u7528\uff0c\u5e76\u4f7f\u7528 amplify init \u547d\u4ee4\u8fdb\u884c\u521d\u59cb\u5316\u914d\u7f6e\u3002<br \/>\n\u8bf7\u6839\u636e\u9700\u8981\u81ea\u884c\u8c03\u6574\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684 profile \u7b49\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>create-react-app boardapp <span class=\"nt\">--typescript<\/span>\r\n<span class=\"nv\">$ <\/span><span class=\"nb\">cd <\/span>boardapp\r\n<span class=\"nv\">$ <\/span>amplify init\r\nNote: It is recommended to run this <span class=\"nb\">command <\/span>from the root of your app directory\r\n? Enter a name <span class=\"k\">for <\/span>the project boardapp\r\n? Enter a name <span class=\"k\">for <\/span>the environment dev\r\n? Choose your default editor: Visual Studio Code\r\n? Choose the <span class=\"nb\">type <\/span>of app that you<span class=\"s1\">'re building javascript\r\nPlease tell us about your project\r\n? What javascript framework are you using react\r\n? Source Directory Path:  src\r\n? Distribution Directory Path: build\r\n? Build Command:  npm run-script build\r\n? Start Command: npm run-script start\r\n? Do you want to use an AWS profile? Yes\r\n? Please choose the profile you want to use default\r\n<\/span><\/code><\/pre>\n<p>\u6dfb\u52a0GraphQL\u7684API\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify add api\r\n? Please <span class=\"k\">select <\/span>from one of the below mentioned services GraphQL\r\n? Provide API name: boardapp\r\n? Choose an authorization <span class=\"nb\">type <\/span><span class=\"k\">for <\/span>the API API key\r\n? Do you have an annotated GraphQL schema? No\r\n? Do you want a guided schema creation? No\r\n? Provide a custom <span class=\"nb\">type <\/span>name Post\r\n<\/code><\/pre>\n<p>\u7531\u65bc\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0b\u67b6\u69cb\u7684\u793a\u4f8b\uff0c\u56e0\u6b64\u76f4\u63a5\u4f7f\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">type<\/span> <span class=\"n\">Post<\/span> <span class=\"err\">@<\/span><span class=\"n\">model<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"n\">id<\/span><span class=\"p\">:<\/span> <span class=\"nb\">ID<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">title<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">content<\/span><span class=\"p\">:<\/span> <span class=\"nb\">String<\/span><span class=\"p\">!<\/span>\r\n    <span class=\"n\">price<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Int<\/span>\r\n    <span class=\"n\">rating<\/span><span class=\"p\">:<\/span> <span class=\"nb\">Float<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u8fdb\u884c\u90e8\u7f72\u5e76\u81ea\u52a8\u751f\u6210\u5ba2\u6237\u7aef\u4ee3\u7801\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>amplify push\r\n? Are you sure you want to <span class=\"k\">continue<\/span>? Yes\r\n? Do you want to generate code <span class=\"k\">for <\/span>your newly created GraphQL API Yes\r\n? Choose the code generation language target typescript\r\n? Enter the file name pattern of graphql queries, mutations and subscriptions src\/graphql\/<span class=\"k\">**<\/span>\/<span class=\"k\">*<\/span>.ts\r\n? Do you want to generate\/update all possible GraphQL operations - queries, mutations and subscriptions Yes\r\n? Enter maximum statement depth <span class=\"o\">[<\/span>increase from default <span class=\"k\">if <\/span>your schema is deeply nested] 2\r\n? Enter the file name <span class=\"k\">for <\/span>the generated code src\/API.ts\r\n<\/code><\/pre>\n<p>\u5f53\u62b5\u8fbe\u8fd9\u91cc\u65f6\uff0cGraphQL\u7684API\u5df2\u7ecf\u90e8\u7f72\u5230\u4e86AWS\u4e0a\uff0c\u672c\u5730\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>tree <span class=\"nt\">-L<\/span> 5 <span class=\"nt\">-I<\/span> <span class=\"s2\">\"node_modules\"<\/span>\r\n<span class=\"nb\">.<\/span>\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 amplify\r\n\u2502   \u251c\u2500\u2500 <span class=\"c\">#current-cloud-backend<\/span>\r\n\u2502   \u2502   \u251c\u2500\u2500 amplify-meta.json\r\n\u2502   \u2502   \u251c\u2500\u2500 api\r\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 boardapp\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 build\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 parameters.json\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 resolvers\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 schema.graphql\r\n\u2502   \u2502   \u2502       \u2514\u2500\u2500 stacks\r\n\u2502   \u2502   \u2514\u2500\u2500 backend-config.json\r\n\u2502   \u251c\u2500\u2500 backend\r\n\u2502   \u2502   \u251c\u2500\u2500 amplify-meta.json\r\n\u2502   \u2502   \u251c\u2500\u2500 api\r\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 boardapp\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 build\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 parameters.json\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 resolvers\r\n\u2502   \u2502   \u2502       \u251c\u2500\u2500 schema.graphql\r\n\u2502   \u2502   \u2502       \u2514\u2500\u2500 stacks\r\n\u2502   \u2502   \u251c\u2500\u2500 awscloudformation\r\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 nested-cloudformation-stack.yml\r\n\u2502   \u2502   \u2514\u2500\u2500 backend-config.json\r\n\u2502   \u2514\u2500\u2500 team-provider-info.json\r\n\u251c\u2500\u2500 package.json\r\n\u251c\u2500\u2500 public\r\n\u2502   \u251c\u2500\u2500 favicon.ico\r\n\u2502   \u251c\u2500\u2500 index.html\r\n\u2502   \u2514\u2500\u2500 manifest.json\r\n\u251c\u2500\u2500 src\r\n\u2502   \u251c\u2500\u2500 API.ts\r\n\u2502   \u251c\u2500\u2500 App.css\r\n\u2502   \u251c\u2500\u2500 App.test.tsx\r\n\u2502   \u251c\u2500\u2500 App.tsx\r\n\u2502   \u251c\u2500\u2500 aws-exports.js\r\n\u2502   \u251c\u2500\u2500 graphql\r\n\u2502   \u2502   \u251c\u2500\u2500 mutations.ts\r\n\u2502   \u2502   \u251c\u2500\u2500 queries.ts\r\n\u2502   \u2502   \u251c\u2500\u2500 schema.json\r\n\u2502   \u2502   \u2514\u2500\u2500 subscriptions.ts\r\n\u2502   \u251c\u2500\u2500 index.css\r\n\u2502   \u251c\u2500\u2500 index.tsx\r\n\u2502   \u251c\u2500\u2500 logo.svg\r\n\u2502   \u251c\u2500\u2500 react-app-env.d.ts\r\n\u2502   \u2514\u2500\u2500 serviceWorker.ts\r\n\u251c\u2500\u2500 tsconfig.json\r\n\u2514\u2500\u2500 yarn.lock\r\n<\/code><\/pre>\n<h2>\u6dfb\u52a0amplify\u7684\u8f6f\u4ef6\u5305<\/h2>\n<p>\u4f7f\u7528yarn\u5c06\u8f6f\u4ef6\u5305\u6ce8\u518c\u3002<br \/>\n\u4f3c\u4e4e\u8fd8\u4f1a\u4e00\u540c\u6ce8\u518cTypeScript\u7684\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>yarn add aws-amplify aws-amplify-react\r\n<\/code><\/pre>\n<h2>\u5e94\u7528\u7a0b\u5e8f\u7684\u5347\u7ea7<\/h2>\n<p>\u9996\u5148\uff0c\u6211\u4eec\u5c06\u4fee\u6539\u7531create-react-app\u81ea\u52a8\u751f\u6210\u7684\u4ee3\u7801\u3002\u63a5\u4e0b\u6765\u662fAmplify\u7684\u521d\u59cb\u5316\u90e8\u5206\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=\"dl\">'<\/span><span class=\"s1\">.\/index.css<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">App<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/App<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"o\">*<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">serviceWorker<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">.\/serviceWorker<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">Amplify<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">aws-amplify<\/span><span class=\"dl\">\"<\/span>  <span class=\"c1\">\/\/ \u8ffd\u52a0<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"nx\">config<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/aws-exports<\/span><span class=\"dl\">\"<\/span> <span class=\"c1\">\/\/ \u8ffd\u52a0<\/span>\r\n<span class=\"nx\">Amplify<\/span><span class=\"p\">.<\/span><span class=\"nx\">configure<\/span><span class=\"p\">(<\/span><span class=\"nx\">config<\/span><span class=\"p\">)<\/span>          <span class=\"c1\">\/\/ \u8ffd\u52a0<\/span>\r\n\r\n<span class=\"nx\">ReactDOM<\/span><span class=\"p\">.<\/span><span class=\"nx\">render<\/span><span class=\"p\">(&lt;<\/span><span class=\"nc\">App<\/span> <span class=\"p\">\/&gt;,<\/span> <span class=\"nb\">document<\/span><span class=\"p\">.<\/span><span class=\"nx\">getElementById<\/span><span class=\"p\">(<\/span><span class=\"dl\">'<\/span><span class=\"s1\">root<\/span><span class=\"dl\">'<\/span><span class=\"p\">));<\/span>\r\n\r\n<span class=\"c1\">\/\/ If you want your app to work offline and load faster, you can change<\/span>\r\n<span class=\"c1\">\/\/ unregister() to register() below. Note this comes with some pitfalls.<\/span>\r\n<span class=\"c1\">\/\/ Learn more about service workers: https:\/\/bit.ly\/CRA-PWA<\/span>\r\n<span class=\"nx\">serviceWorker<\/span><span class=\"p\">.<\/span><span class=\"nx\">unregister<\/span><span class=\"p\">();<\/span>\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\u662f\u5e94\u7528\u7a0b\u5e8f\u672c\u8eab\u3002\u5173\u952e\u70b9\u7a0d\u540e\u5c06\u4f1a\u89e3\u91ca\u3002<br \/>\n\u53e6\u5916\uff0c\u7531\u4e8e\u4e3b\u8981\u76ee\u7684\u662f\u7406\u89e3\u6d41\u7a0b\uff0c\u6240\u4ee5\u6ca1\u6709\u8fdb\u884c\u9519\u8bef\u5904\u7406\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">React<\/span><span class=\"p\">,<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">useEffect<\/span><span class=\"p\">,<\/span> <span class=\"nx\">useState<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">react<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">API<\/span><span class=\"p\">,<\/span> <span class=\"nx\">graphqlOperation<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">aws-amplify<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">listPosts<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/queries<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">createPost<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/mutations<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"k\">import<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">onCreatePost<\/span> <span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/graphql\/subscriptions<\/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\">ListPostsQuery<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">OnCreatePostSubscription<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">CreatePostMutationVariables<\/span>\r\n<span class=\"p\">}<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">.\/API<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">type<\/span> <span class=\"nx\">Post<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">rating<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">type<\/span> <span class=\"nx\">FormState<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">type<\/span> <span class=\"nx\">PostSubscriptionEvent<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">OnCreatePostSubscription<\/span> <span class=\"p\">}<\/span> <span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">usePosts<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">posts<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setPosts<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Post<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">([]);<\/span>\r\n\r\n  <span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <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=\"c1\">\/\/ \u6700\u521d\u306ePost\u4e00\u89a7\u53d6\u5f97<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">));<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">posts<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">ListPostsQuery<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">posts<\/span><span class=\"p\">.<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">setPosts<\/span><span class=\"p\">(<\/span><span class=\"nx\">posts<\/span><span class=\"p\">.<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">.<\/span><span class=\"nx\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Post<\/span><span class=\"p\">[]);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">}<\/span>\r\n\r\n      <span class=\"c1\">\/\/ Post\u8ffd\u52a0\u30a4\u30d9\u30f3\u30c8\u306e\u8cfc\u8aad<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">));<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">subscribe<\/span><span class=\"dl\">\"<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">client<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">({<\/span>\r\n          <span class=\"na\">next<\/span><span class=\"p\">:<\/span> <span class=\"p\">({<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">data<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}:<\/span> <span class=\"nx\">PostSubscriptionEvent<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n              <span class=\"kd\">const<\/span> <span class=\"na\">post<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Post<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">;<\/span>\r\n              <span class=\"nx\">setPosts<\/span><span class=\"p\">(<\/span><span class=\"nx\">prev<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[...<\/span><span class=\"nx\">prev<\/span><span class=\"p\">,<\/span> <span class=\"nx\">post<\/span><span class=\"p\">]);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">});<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">})();<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[]);<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"nx\">posts<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">App<\/span><span class=\"p\">:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">FC<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">input<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setInput<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">FormState<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span>\r\n  <span class=\"p\">});<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">posts<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">usePosts<\/span><span class=\"p\">();<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">onFormChange<\/span> <span class=\"o\">=<\/span> <span class=\"p\">({<\/span>\r\n    <span class=\"na\">target<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">name<\/span><span class=\"p\">,<\/span> <span class=\"nx\">value<\/span> <span class=\"p\">}<\/span>\r\n  <span class=\"p\">}:<\/span> <span class=\"nx\">React<\/span><span class=\"p\">.<\/span><span class=\"nx\">ChangeEvent<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">HTMLInputElement<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">setInput<\/span><span class=\"p\">(<\/span><span class=\"nx\">prev<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">({<\/span> <span class=\"p\">...<\/span><span class=\"nx\">prev<\/span><span class=\"p\">,<\/span> <span class=\"p\">[<\/span><span class=\"nx\">name<\/span><span class=\"p\">]:<\/span> <span class=\"nx\">value<\/span> <span class=\"p\">}));<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"kd\">const<\/span> <span class=\"nx\">onPost<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"na\">newPost<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CreatePostMutationVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">};<\/span>\r\n    <span class=\"nx\">setInput<\/span><span class=\"p\">({<\/span> <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createPost<\/span><span class=\"p\">,<\/span> <span class=\"nx\">newPost<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"p\">};<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"p\">(<\/span>\r\n    <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">className<\/span><span class=\"p\">=<\/span><span class=\"s\">\"App\"<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n        \u30bf\u30a4\u30c8\u30eb\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">input<\/span> <span class=\"na\">value<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"si\">}<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"title\"<\/span> <span class=\"na\">onChange<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">onFormChange<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n        \u5185\u5bb9\r\n        <span class=\"p\">&lt;<\/span><span class=\"nt\">input<\/span> <span class=\"na\">value<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"si\">}<\/span> <span class=\"na\">name<\/span><span class=\"p\">=<\/span><span class=\"s\">\"content\"<\/span> <span class=\"na\">onChange<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">onFormChange<\/span><span class=\"si\">}<\/span> <span class=\"p\">\/&gt;<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">button<\/span> <span class=\"na\">onClick<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">onPost<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\u8ffd\u52a0<span class=\"p\">&lt;\/<\/span><span class=\"nt\">button<\/span><span class=\"p\">&gt;<\/span>\r\n      <span class=\"p\">&lt;<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n        <span class=\"si\">{<\/span><span class=\"nx\">posts<\/span><span class=\"p\">.<\/span><span class=\"nx\">map<\/span><span class=\"p\">(<\/span><span class=\"nx\">data<\/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=\"p\">&lt;<\/span><span class=\"nt\">div<\/span> <span class=\"na\">key<\/span><span class=\"p\">=<\/span><span class=\"si\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">id<\/span><span class=\"si\">}<\/span><span class=\"p\">&gt;<\/span>\r\n              <span class=\"p\">&lt;<\/span><span class=\"nt\">h4<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">h4<\/span><span class=\"p\">&gt;<\/span>\r\n              <span class=\"p\">&lt;<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span><span class=\"si\">{<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span><span class=\"si\">}<\/span><span class=\"p\">&lt;\/<\/span><span class=\"nt\">p<\/span><span class=\"p\">&gt;<\/span>\r\n            <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n          <span class=\"p\">);<\/span>\r\n        <span class=\"p\">})<\/span><span class=\"si\">}<\/span>\r\n      <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n    <span class=\"p\">&lt;\/<\/span><span class=\"nt\">div<\/span><span class=\"p\">&gt;<\/span>\r\n  <span class=\"p\">);<\/span>\r\n<span class=\"p\">};<\/span>\r\n\r\n<span class=\"k\">export<\/span> <span class=\"k\">default<\/span> <span class=\"nx\">App<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u5269\u4e0b\u7684\u5c31\u53ea\u662f\u542f\u52a8\u4e86\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">$ <\/span>yarn start\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8219913a08637a6aedfa\/29-0.png\" alt=\"board.png\" \/><\/div>\n<p>\u5f53\u6253\u5f00\u591a\u4e2a\u753b\u9762\u65f6\uff0c\u5b83\u4eec\u5c06\u540c\u65f6\u5b9e\u65f6\u66f4\u65b0\u3002<\/p>\n<h2>\u89e3\u91ca\u548c\u611f\u60f3<\/h2>\n<h3>\u6a21\u7279\u513f<\/h3>\n<p>\u7531\u4e8e\u5728src\/API.ts\u4e2d\u81ea\u52a8\u751f\u6210\u4e86\u4e0egraphql\u6a21\u5f0f\u5339\u914d\u7684\u7c7b\u578b\uff0c\u56e0\u6b64\u57fa\u672c\u4e0a\u4f7f\u7528\u5728\u8fd9\u91cc\u5b9a\u4e49\u7684\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">ListPostsQuery<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">listPosts<\/span><span class=\"p\">:<\/span>  <span class=\"p\">{<\/span>\r\n    <span class=\"na\">__typename<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">ModelPostConnection<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">items<\/span><span class=\"p\">:<\/span>  <span class=\"nb\">Array<\/span><span class=\"o\">&lt;<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">__typename<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Post<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n      <span class=\"na\">rating<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">&gt;<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">nextToken<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/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\">OnUpdatePostSubscription<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">onUpdatePost<\/span><span class=\"p\">:<\/span>  <span class=\"p\">{<\/span>\r\n    <span class=\"na\">__typename<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">Post<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">rating<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"p\">}<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8ePost\u4e2d\u6ca1\u6709\u4ec5\u5305\u542b\u5185\u5bb9\u7684\u7c7b\u578b\uff0c\u56e0\u6b64\u6211\u4eec\u81ea\u884c\u5b9a\u4e49\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">type<\/span> <span class=\"nx\">Post<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">id<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">price<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n  <span class=\"nl\">rating<\/span><span class=\"p\">:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8eGraphQL\u7684\u67b6\u6784\u662f\u539f\u59cb\u7684\uff0c\u6240\u4ee5\u6211\u4e5f\u5e0c\u671b\u80fd\u81ea\u52a8\u751f\u6210\u3002<\/p>\n<h2>\u6ce8\u518c<\/h2>\n<p>\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5728\u70b9\u51fb\u8ffd\u52a0\u6309\u94ae\u65f6\u8c03\u7528\u7684\u3002<\/p>\n<pre class=\"post-pre\"><code>  <span class=\"kd\">const<\/span> <span class=\"nx\">onPost<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span> <span class=\"o\">===<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">)<\/span> <span class=\"k\">return<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"kd\">const<\/span> <span class=\"na\">newPost<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CreatePostMutationVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n      <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">title<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"nx\">input<\/span><span class=\"p\">.<\/span><span class=\"nx\">content<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">};<\/span>\r\n    <span class=\"nx\">setInput<\/span><span class=\"p\">({<\/span> <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span><span class=\"p\">,<\/span> <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"\"<\/span> <span class=\"p\">});<\/span>\r\n    <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">createPost<\/span><span class=\"p\">,<\/span> <span class=\"nx\">newPost<\/span><span class=\"p\">));<\/span>\r\n  <span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u7531\u4e8eGraphQL\u81ea\u52a8\u751f\u6210\u4e86\u4ee3\u8868\u6027\u7684\u67e5\u8be2\uff0c\u60a8\u53ef\u4ee5\u901a\u8fc7\u5c06\u5176\u6307\u5b9a\u4e3agraphqlOperation\u6765\u5207\u6362\u67e5\u8be2\u7c7b\u578b\u3002\u5728\u8fd9\u91cc\uff0c\u7531\u4e8e\u662f\u8fdb\u884c\u65b0\u7684\u6ce8\u518c\uff0c\u6240\u4ee5\u6211\u4eec\u4f7f\u7528createPost\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">const<\/span> <span class=\"nx\">createPost<\/span> <span class=\"o\">=<\/span> <span class=\"s2\">`mutation CreatePost($input: CreatePostInput!) {\r\n  createPost(input: $input) {\r\n    id\r\n    title\r\n    content\r\n    price\r\n    rating\r\n  }\r\n}\r\n`<\/span><span class=\"p\">;<\/span>\r\n<\/code><\/pre>\n<p>\u53ea\u9700\u8bbe\u7f6e\u8981\u6ce8\u518c\u7684\u6570\u636e\u5e76\u53d1\u9001\u67e5\u8be2\uff0c\u56e0\u4e3a\u5df2\u81ea\u52a8\u751f\u6210\u4e86\u4e0e\u8ffd\u52a0\u53c2\u6570$input: CreatePostInput!\u5bf9\u5e94\u7684\u7c7b\u578b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">export<\/span> <span class=\"kd\">type<\/span> <span class=\"nx\">CreatePostInput<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"nx\">id<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">string<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">title<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"na\">content<\/span><span class=\"p\">:<\/span> <span class=\"kr\">string<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">price<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"nx\">rating<\/span><span class=\"p\">?:<\/span> <span class=\"kr\">number<\/span> <span class=\"o\">|<\/span> <span class=\"kc\">null<\/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\">CreatePostMutationVariables<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"na\">input<\/span><span class=\"p\">:<\/span> <span class=\"nx\">CreatePostInput<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<h3>\u76d1\u63a7\u4e00\u89c8\u6570\u636e\u83b7\u53d6\u548c\u6570\u636e\u6ce8\u518c<\/h3>\n<p>\u901a\u8fc7\u521b\u5efa\u81ea\u5b9a\u4e49\u94a9\u5b50\u5b9e\u73b0\u6ce8\u518c\u6570\u636e\u7684\u5217\u8868\u83b7\u53d6\u548c\u65b0\u589e\u6570\u636e\u7684\u76d1\u89c6\u3002<\/p>\n<p>\u901a\u8fc7\u5728\u7ec4\u4ef6\u6302\u8f7d\u65f6\u4f7f\u7528 useEffect\uff0c\u5728\u987a\u5e8f\u4e0a\u6dfb\u52a0\u83b7\u53d6\u5e16\u5b50\u5217\u8868\u548c\u521b\u5efa\u5e16\u5b50\u7684\u8ba2\u9605\uff0c\u7136\u540e\u4f7f\u7528 useState \u8fd4\u56de\u521b\u5efa\u7684\u5e16\u5b50\u5217\u8868\u4f5c\u4e3a\u8fd4\u56de\u503c\uff0c\u4ee5\u4f20\u8fbe\u5e16\u5b50\u5217\u8868\u7684\u66f4\u65b0\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"kd\">type<\/span> <span class=\"nx\">PostSubscriptionEvent<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"na\">data<\/span><span class=\"p\">:<\/span> <span class=\"nx\">OnCreatePostSubscription<\/span> <span class=\"p\">}<\/span> <span class=\"p\">};<\/span>\r\n\r\n<span class=\"kd\">const<\/span> <span class=\"nx\">usePosts<\/span> <span class=\"o\">=<\/span> <span class=\"p\">()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n  <span class=\"kd\">const<\/span> <span class=\"p\">[<\/span><span class=\"nx\">posts<\/span><span class=\"p\">,<\/span> <span class=\"nx\">setPosts<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">useState<\/span><span class=\"o\">&lt;<\/span><span class=\"nx\">Post<\/span><span class=\"p\">[]<\/span><span class=\"o\">&gt;<\/span><span class=\"p\">([]);<\/span>\r\n\r\n  <span class=\"nx\">useEffect<\/span><span class=\"p\">(()<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <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=\"c1\">\/\/ \u6700\u521d\u306ePost\u4e00\u89a7\u53d6\u5f97<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">=<\/span> <span class=\"k\">await<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">));<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">data<\/span><span class=\"dl\">\"<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">result<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"kd\">const<\/span> <span class=\"nx\">posts<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">result<\/span><span class=\"p\">.<\/span><span class=\"nx\">data<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">ListPostsQuery<\/span><span class=\"p\">;<\/span>\r\n        <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">posts<\/span><span class=\"p\">.<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n          <span class=\"nx\">setPosts<\/span><span class=\"p\">(<\/span><span class=\"nx\">posts<\/span><span class=\"p\">.<\/span><span class=\"nx\">listPosts<\/span><span class=\"p\">.<\/span><span class=\"nx\">items<\/span> <span class=\"k\">as<\/span> <span class=\"nx\">Post<\/span><span class=\"p\">[]);<\/span>\r\n        <span class=\"p\">}<\/span>\r\n      <span class=\"p\">}<\/span>\r\n\r\n      <span class=\"c1\">\/\/ Post\u8ffd\u52a0\u30a4\u30d9\u30f3\u30c8\u306e\u8cfc\u8aad<\/span>\r\n      <span class=\"kd\">const<\/span> <span class=\"nx\">client<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">API<\/span><span class=\"p\">.<\/span><span class=\"nx\">graphql<\/span><span class=\"p\">(<\/span><span class=\"nx\">graphqlOperation<\/span><span class=\"p\">(<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">));<\/span>\r\n      <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">subscribe<\/span><span class=\"dl\">\"<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">client<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nx\">client<\/span><span class=\"p\">.<\/span><span class=\"nx\">subscribe<\/span><span class=\"p\">({<\/span>\r\n          <span class=\"na\">next<\/span><span class=\"p\">:<\/span> <span class=\"p\">({<\/span> <span class=\"na\">value<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span> <span class=\"nx\">data<\/span> <span class=\"p\">}<\/span> <span class=\"p\">}:<\/span> <span class=\"nx\">PostSubscriptionEvent<\/span><span class=\"p\">)<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n              <span class=\"kd\">const<\/span> <span class=\"na\">post<\/span><span class=\"p\">:<\/span> <span class=\"nx\">Post<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">data<\/span><span class=\"p\">.<\/span><span class=\"nx\">onCreatePost<\/span><span class=\"p\">;<\/span>\r\n              <span class=\"nx\">setPosts<\/span><span class=\"p\">(<\/span><span class=\"nx\">prev<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[...<\/span><span class=\"nx\">prev<\/span><span class=\"p\">,<\/span> <span class=\"nx\">post<\/span><span class=\"p\">]);<\/span>\r\n            <span class=\"p\">}<\/span>\r\n          <span class=\"p\">}<\/span>\r\n        <span class=\"p\">});<\/span>\r\n      <span class=\"p\">}<\/span>\r\n    <span class=\"p\">})();<\/span>\r\n  <span class=\"p\">},<\/span> <span class=\"p\">[]);<\/span>\r\n\r\n  <span class=\"k\">return<\/span> <span class=\"nx\">posts<\/span><span class=\"p\">;<\/span>\r\n<span class=\"p\">};<\/span>\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u786e\u4fdd\u7c7b\u578b\u7684\u4e00\u81f4\u6027\uff0c\u8fd9\u6709\u70b9\u590d\u6742\u3002<\/p>\n<p>API.graphql\u7684\u8fd4\u56de\u7c7b\u578b\u662fPromise | Observable<object width=\"300\" height=\"150\">\u3002\u6839\u636egraphqlOperation\u7684\u53c2\u6570\u5185\u5bb9\uff0c\u8fd4\u56de\u7c7b\u578b\u4f1a\u53d1\u751f\u53d8\u5316\u3002\u7531\u4e8e\u8fd4\u56de\u503c\u7684\u6570\u636e\u7c7b\u578b\u662fobject\uff0c\u5e76\u4e14\u65e0\u6cd5\u901a\u8fc7\u6cdb\u578b\u8fdb\u884c\u6307\u5b9a\uff0c\u56e0\u6b64\u9700\u8981\u4f7f\u7528if\u8bed\u53e5\u5728\u67d0\u4e9b\u5730\u65b9\u8fdb\u884c\u7c7b\u578b\u7f29\u5c0f\uff0c\u6216\u8005\u4f7f\u7528as\u8fdb\u884c\u7c7b\u578b\u8f6c\u6362\u3002\u4e5f\u8bb8\u8fd8\u6709\u66f4\u597d\u7684\u65b9\u6cd5\u4f7f\u7528\u5b83\uff0c\u4f46\u6211\u5e0c\u671b\u5b83\u80fd\u66f4\u52a0\u65b9\u4fbf\u4e00\u4e9b\u3002<\/p>\n<h2>\u6700\u540e<\/h2>\n<p>\u8d77\u521d\u6211\u5f88\u96be\u6293\u4f4f\u6574\u4f53\u7684\u6982\u5ff5\uff0c\u4f46\u5b9e\u9645\u4f7f\u7528\u8d77\u6765\uff0cGraphQL\u7684API\u6bd4\u6211\u60f3\u8c61\u7684\u8fd8\u8981\u5bb9\u6613\u5efa\u7acb\u3002\u9664\u4e86DynamoDB\uff0c\u5b83\u8fd8\u53ef\u4ee5\u4e0eRDB\u548cLambda\u8fdb\u884c\u8fde\u63a5\uff0c\u4f3c\u4e4e\u53ef\u4ee5\u6709\u8bb8\u591a\u5e94\u7528\uff0c\u5e76\u4e14\u975e\u5e38\u65b9\u4fbf\u3002<\/object><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6211\u53d7[&#8220;\u3010\u7206\u901f\u3011React+Amplify+AppSync\u3067\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u63b2\u793a\u677f\u30a2\u30d7\u30ea\u309215\u5206\u3067\u4f5c\u308a [&hellip;]<\/p>\n","protected":false},"author":10,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-47920","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>\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f - 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\/\u4f7f\u7528reactamplifyappsynctypescript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\" \/>\n<meta property=\"og:description\" content=\"\u6211\u53d7[&#8220;\u3010\u7206\u901f\u3011React+Amplify+AppSync\u3067\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u63b2\u793a\u677f\u30a2\u30d7\u30ea\u309215\u5206\u3067\u4f5c\u308a [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528reactamplifyappsynctypescript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2024-01-24T08:42:25+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T12:36:36+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8219913a08637a6aedfa\/0-0.png\" \/>\n<meta name=\"author\" content=\"\u5b87, \u534e\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u5b87, \u534e\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \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\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\",\"name\":\"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2024-01-24T08:42:25+00:00\",\"dateModified\":\"2024-04-29T12:36:36+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\"}]},{\"@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\/513018e4e121d3add1b7c5de8be21458\",\"name\":\"\u5b87, \u534e\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g\",\"caption\":\"\u5b87, \u534e\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f - 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\/\u4f7f\u7528reactamplifyappsynctypescript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f","og_description":"\u6211\u53d7[&#8220;\u3010\u7206\u901f\u3011React+Amplify+AppSync\u3067\u30ea\u30a2\u30eb\u30bf\u30a4\u30e0\u63b2\u793a\u677f\u30a2\u30d7\u30ea\u309215\u5206\u3067\u4f5c\u308a [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528reactamplifyappsynctypescript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2024-01-24T08:42:25+00:00","article_modified_time":"2024-04-29T12:36:36+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8219913a08637a6aedfa\/0-0.png"}],"author":"\u5b87, \u534e","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u5b87, \u534e","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/","name":"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2024-01-24T08:42:25+00:00","dateModified":"2024-04-29T12:36:36+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/513018e4e121d3add1b7c5de8be21458"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528React+Amplify+AppSync+TypeScript\u6784\u5efa\u5b9e\u65f6\u7559\u8a00\u677f\u5e94\u7528\u7a0b\u5e8f"}]},{"@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\/513018e4e121d3add1b7c5de8be21458","name":"\u5b87, \u534e","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/63cd45cbc05a35fc4ff7637a163c83c4962ef58d27472726c3a3e0c9c5194f0f?s=96&d=mm&r=g","caption":"\u5b87, \u534e"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yuhua\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8reactamplifyappsynctypescript%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e7%95%99%e8%a8%80%e6%9d%bf%e5%ba%94%e7%94%a8%e7%a8%8b%e5%ba%8f%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\/47920","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\/10"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=47920"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47920\/revisions"}],"predecessor-version":[{"id":87506,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/47920\/revisions\/87506"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=47920"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=47920"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=47920"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}