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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

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

Q&A

解決済

1回答

2959閲覧

TypeScriptでJSON.parseに適切なtype(型)が分からない

moimoi_sushi

総合スコア26

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

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

0グッド

0クリップ

投稿2020/06/03 09:41

編集2020/06/03 10:32

前提・実現したいこと

TypeScript初心者です。duckduckGoの検索結果を取得する機能を制作中です。サーバーから受け取った検索結果データのJSON含むオブジェクトに適切なtypeを指定したいです。
現状では型エラーが生じています。

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

interfaceでサーバーから受け取ったデータ構造に合わせて型宣言しています。
その型をそれぞれの変数に当てはめていますがうまくいきません。

エラーメッセージ: Argument of type 'duckGoResults[]' is not assignable to parameter of type 'string' エラー箇所のソースコード: const duckGoDom: duckGoResults[] = JSON.parse(duckGo);

該当のソースコード

**受け取るデータ(response: duckGoData)の中身。 「 JSON.parse typescript 」 の検索結果** { type: "backgroundMsg", results: "[ {"title":"javascript - How to parse JSON string in Typescript - Stack ...","url":"https://stackoverflow.com/questions/38688822/how-to-parse-json-string-in-typescript","snippet":"Typescript is (a superset of) javascript, so you just use J..."}, {"title":"TypeScriptのリフレクションでJSONの型変換を自動化する - Qiita","url":"https://qiita.com/bitrinjani/items/d60bdac10e5ced126d1a","snippet":"3. JSON.parseの結果をコンストラクタでくくる これだけで、TypeScriptで指定した型に自動的に変換さ..."}, {"title":"JSON.parse() - JavaScript | MDN","url":"https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse","snippet":"JSON.parse() メソッドは文字列を JSON として解析し、文字列によって記述されている JavaScrip..."}, . . . (以下27行) ]", waitFlag: true, }

typescript

1interface duckGoData { 2 type: string; 3 results: { 4 title: string; 5 url: string; 6 snippet: string; 7 }[]; 8 waitFlag: boolean; 9} 10 11//JSON.parse後の変数の型 12interface duckGoResults { 13 title: string; 14 url: string; 15 snippet: string; 16}[]; 17 18const addDom = ( response: duckGoData ) => { 19 // 最初にwaitFlag処理 20 const duckGo: duckGoResults[] = response.results; 21 const duckGoDom: duckGoResults[] = JSON.parse(duckGo); //error該当箇所。 22 23 const responseItem = (result: duckGoResults) => { 24 return ` 25 <div id="dupliChecker" class="ducks"> 26 <div class="ducks__padding"> 27 <div class="ducks__title"><a href="${result.url}">${result.title}</a></div> 28 <div class="ducks__url"><a href="${result.url}">${decodeURI(result.url)}</a></div> 29 <div class="ducks__snippet"><p>${result.snippet}</p></div> 30 </div> 31 </div> 32 ` 33 } 34 // 以下Dom処理コード 35}

試したこと

少しずつinterfaceを変えて試して見たりしましたがうまくいきませんでした。検索しても同様の質問は見つけられず。

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

該当箇所のエラーメッセージをVSCodeから切り取りました。
イメージ説明

tsconfig.jsonに "strict": true を設定しています。

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

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

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

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

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

hoshi-takanori

2020/06/03 09:47

JSON.parse の引数には文字列を渡す必要がありますが、引数として渡している duckGo の型がその前の行で duckGoResults[] だからですね。addDom を呼び出してるコードによりますが、すでに JSON として parse 済みであれば再度 JSON.parse を呼び出す必要はないはずです。
moimoi_sushi

2020/06/03 10:37

引数を受け取った時点ではparseは済んでおらずJSONです。JSONはstringでなければならない点のご指摘を汲んで、 interface duckGoData { type: string; results: string //ここをstringへ変更 waitFlag: boolean; } へと修正し、 const duckGo: string = response.results; へと変更したらエラーが発生しなくなりました。 JSONのstringとparse後のオブジェクト構造を混合してしまっていたことが回答をいただいた判明しました。ありがとうございます。
guest

回答1

0

自己解決

hoshi-takanoriさんからいただいた「質問への追記・修正の依頼」の内容に応じて

型宣言
interface duckGoData {
type: string;
results: string //ここをstringへ変更
waitFlag: boolean;
}

JOSN.parse()前
const duckGo: string = response.results;

へと変更することで問題解決しました。ありがとうございました。

投稿2020/06/03 10:39

moimoi_sushi

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問