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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

TypeScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

1回答

2633閲覧

TypeScriptでArgument of type 'any' is not assignable to parameter of type 'never'.というエラーが出る

shoko_sjb

総合スコア6

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

TypeScript

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

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/01/23 09:13

現在以下のコードで表題のエラーが出力されます。
APIデータから特定の値を取得して画面表示を行うという単純なことを行いたいのですが、表題のエラーが出て詰まっております。
対応策があれば教えていただきたく思います。
自身で調べられた範囲ですと、APIから取得する配列(とその中のオブジェクト)の構造を型定義するとうまくいくとあったのですが、APIデータの構造上ネストが多く型定義をするのが手間なので、チェックを行わず通る方法があれば教えていただきたいです。また、APIデータをTypeScriptで扱う場合どのように型チェックを行うのが一般的なのでしょうか。
TypeScript初心者のため、ご教授いただければと思います。
よろしくお願いします。

※Vue.jsをTypeScriptで書いており、一部を抜粋しています。

TypeScript

1import apiKicker from "../ApiKicker"; 2 3let items: any[] = []; 4//APIをキック 5const apikicker = new apiKicker(xxxxx); 6await apikicker.apiKicker().then(results => { 7 //APIの結果をitemsに設定 8 items = results; 9}); 10items.forEach(e => { 11  //songTitleにitems配列の中のオブジェクトに格納された値を設定 12 this.songTitle.push(e.track.name);//★e.track.nameで表題のエラー 13});

APIから結果を取得できているところまでは確認できており、データ構造は以下の通りで(Spotify APIを使用)、配列の中にオブジェクトが複数格納されているもので、オブジェクトがネストしているものもあります。
[
0:
{added_at: "2018-12-15T07:35:03Z"
added_by: {external_urls: {…}, href: "https://api.spotify.com/v1/users/XXXX",
id: "XXXX", type: "user", uri: "spotify:user:XXXX"}
track: {album: {…}, artists: Array(1), available_markets: Array(1), disc_number: 1,
duration_ms: XXXX, …}
video_thumbnail: {url: null}
}
1:{0と同様の構造}
2:{0と同様の構造}
]

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

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

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

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

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

storm3

2020/01/23 16:16 編集

提示されたJson形式のサンプルデータが完全でなかったり、肝心なtarckのなかにnameプロパティがなかったり、原因を探るのがわかりにくくなっています。 特にエラー行のthis.songTitleの宣言がないため確かなことはいえませんが、スタックオーバーフローに似た内容の現象があります。 こちらと同じではないでしょうか? https://stackoverflow.com/questions/52054140/why-push-shows-argument-of-type-any-is-not-assignable-to-parameter-of-type/52059228
shoko_sjb

2020/01/30 07:45

storm3さん 回答いただきありがとうございます! anyではなくinterfaceで型指定をすることで解消できました。 anyは基本的に使用しないほうが良いんですね。ありがとうございます。
guest

回答1

0

ベストアンサー

storm3さんのコメントの通り、trackの中にnameプロパティがなかったりなどしているようなので、anyではなく、interfaceを用意すればいいと思います。

typescript

1import apiKicker from "../ApiKicker"; 2 3interface ItemAddedBy { 4 external_urls: any; 5 href: string; 6 id: string; 7 type: string; 8 uri: string; 9} 10interface ItemTrack { 11 album: any; 12 artists: []; 13 available_markets: []; 14 disc_number: number; 15 duration_ms: string; 16 name?: string; // undefinedを許容する 17} 18interface ItemVideoThumbnail { 19 url?: string; // undefinedを許容(nullではないので注意) 20} 21 22interface Item { 23 added_at: string; 24 added_by: ItemAddedBy; 25 track: ItemTrack; 26 video_thumbnail: ItemVideoThumbnail; 27} 28 29let items: Item[] = []; 30//APIをキック 31const apikicker = new apiKicker(xxxxx); 32await apikicker.apiKicker().then(results => { 33 // ただし、resultsには、Item[]型が格納されるようにする必要がある。 34 // よって、上記interfaceを、apiKicker上に移し、exportできるようにし、このファイルでimportする必要がある。 35 //APIの結果をitemsに設定 36 items = results; 37}); 38items.forEach(e => { 39 //songTitleにitems配列の中のオブジェクトに格納された値を設定 40 // interfaceで型が保証されているのでエラーは起きないはず 41 this.songTitle.push(e.track.name);//★e.track.nameで表題のエラー 42});

投稿2020/01/24 03:10

miyabi_takatsuk

総合スコア9528

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

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

shoko_sjb

2020/01/30 07:44

回答いただきありがとうございます! 自身で調べた結果でもInterfaceを作成する例が一番載っていました。 miyabi_takatsukさんの例にしたがって作成したところエラーが消えてデータを取得できるようになりました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問