質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

2807閲覧

TypeScriptでネストされたtype定義を取り出したい

qwerty3

総合スコア1

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

1クリップ

投稿2020/09/07 00:21

前提・実現したいこと

TypeScriptでtype定義している型の中にある型を取り出して利用したいです。
下記の items 型を使ってReact Hooksのstateの型の指定をしたいです。
下記の型定義ファイルは自動生成されたもので利用したいitems型のみコピーして貼り付けて利用しても再度上書きされるリスクや項目が変更されるリスクがあり避けたいと思っています。
参照という形で利用できれば非常に良いです。
よろしくお願い致します。

発生している問題・エラーメッセージ

プロパティ 'items' は型 '{ __typename: "ModelMovieConnection"; items: ({ __typename: "Movie"; id: string; title: string; description: string | null; thumbnailPath: string | null; contentPath: string | null; createdAt: string; updatedAt: string; } | null)[] | null; nextToken: string | null; } | null' に存在しません。ts(2339)

該当のソースコード

TypeScript

1const [movies, setMovies] = useState<ListMoviesQuery["listMovies"]["items"]>();

TypeScript

1export type ListMoviesQuery = { 2 listMovies: { 3 __typename: "ModelMovieConnection", 4 items: Array< { 5 __typename: "Movie", 6 id: string, 7 title: string, 8 description: string | null, 9 thumbnailPath: string | null, 10 contentPath: string | null, 11 createdAt: string, 12 updatedAt: string, 13 } | null > | null, 14 nextToken: string | null, 15 } | null, 16};

試したこと

useState<ListMoviesQuery.listMovies>();と書いたところVS CODEのクイックフィックスから提案された修正を実行したら上記のように useState<ListMoviesQuery["listMovies"]と変更されました。
しかし、その更に内側のitemsを参照しようとしたところ上記のようなエラーが発生してしまいました。

補足情報(FW/ツールのバージョンなど)

typescript: 3.9.7
node: 12.18.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ListMoviesQuery["listMovies"] 自体が nullable なので NonNullable で包むことで正しく型が取り出せるようになると思います

typescript

1type Items = NonNullable<ListMoviesQuery["listMovies"]>["items"]; 2 3const Component = () => { 4 const [movies, setMovies] = useState<Items>(); 5 movies?.map(movie => { 6 const id = movie?.id; // string | undefined 7 }); 8};

投稿2020/09/16 11:26

Yama-Tomo

総合スコア49

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問