teratail header banner
teratail header banner
質問するログイン新規登録
JavaScript

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

TypeScript

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

Q&A

解決済

4回答

704閲覧

型エラー解決方法と変数名の違い

skillUp

総合スコア25

JavaScript

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

TypeScript

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

0グッド

0クリップ

投稿2022/10/08 07:54

0

0

実現したいこと

vscodeで「inputs.style.padding」のstyleの下にエラーが表示されるため、エラーを無くしたい。
as型で解決できるのであればその方法を教えていただきたいです。
加えて、型ガードやユーザー定義型ガードでの解決方法も知りたいです。

また、変数「inputs」をたとえば「hoge」とかに変更すると
hogeの下に下記のようなエラーが表示されます。
hoge: Unknown word.

このエラーの原因は、変数名が型を予測しづらくなるためでしょうか。
Input要素を取得するので、変数名を「inputs」のように
取得する要素に関連付くような変数名にしたほうが良いという認識で合っていますでしょうか。

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

プロパティ 'style' は型 'NodeListOf<Element>' に存在しません。

該当のソースコード

Typescript

1 const inputs = document.querySelectorAll('.controls input'); 2 inputs.style.padding = "140px";

HTML

1<div class="controls"> 2 <input type="range" name="spacing" min="10" max="200" value="10" data-sizing="px"> 3</div>

試したこと

querySelectorAllで取得する対象が「input」タグなので
HTMLInputElementであることを示せばよいのかと、試したのですが、
エラーであることは変わらないようです。
(inputs as HTMLInputElement).style.padding = "140px";

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

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

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

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

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

guest

回答4

0

ベストアンサー

querySelectorAllで取得する対象が「input」タグなので

違います。エラーメッセージに出ている通りのNodeListOf<Element>、つまり要素のリストなのです。

そもそも、もの自体が違うのでキャストでは解決しません。

  • 当該の要素が1つとわかっているなら、querySelectorで1個だけ取得しましょう。
  • 複数個存在する場合には、ループを回してリストの中身を1つずつ処理する必要があります。

投稿2022/10/08 08:27

maisumakun

総合スコア146702

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

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

maisumakun

2022/10/08 08:34

> また、変数「inputs」をたとえば「hoge」とかに変更すると hogeの下に下記のようなエラーが表示されます。 2箇所とも書き換えましたか?
skillUp

2022/10/08 08:40

はい。2か所とも書き換えています。 どうやら変数名が3文字までだとエラー表示は出ませんが 4文字以上になると青い波線でエラー表示が出ます。
skillUp

2022/10/08 08:43 編集

しかし、「inputs」は4文字以上ですが、エラー表示が出ません。 「input」でも出ません、「inpu」だとエラー表示が出ます。
guest

0

.querySelectorAll()で取得できるものは、要素ではなくノードリストです。
ですのでstyleを効かすためには、ノードリストの中身の要素に1つ1つstyleを使わなければなりません。

inputタグが複数ある場合

javascript

1inputs.forEach(e => e.style.padding = '140px')

1つしかないなら、.querySelector()がいいと思います!

投稿2022/10/08 08:28

編集2022/10/08 08:30
Cocode

総合スコア2316

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

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

skillUp

2022/10/10 11:37

ノードリストですね。確かに。 ありがとうございます。
guest

0

typescript

1const inputs = document.querySelectorAll<HTMLElement>('.controls input'); 2inputs.forEach(input => { 3 input.style.padding = "140px"; 4});

とします。なおジェネリクス型パラメータの <HTMLElement> を忘れると inputsHTMLElement ではなく単なるElement のリストと推論されてしまって、

typescript

1input.style.padding = "140px";

のところで「Element には styleプロパティが無い」旨のエラーになってしまいます。

投稿2022/10/08 08:41

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

skillUp

2022/10/10 11:38

具体的に示していただき ありがとうございます。 よく理解できました。
guest

0

querySelectorAllで取得する対象が「input」タグなので

いえ。違います。

https://developer.mozilla.org/ja/docs/Web/API/Document/querySelectorAll
Document の querySelectorAll() メソッドは、与えられた CSS セレクターに一致する文書中の要素のリストを示す静的な (ライブではない) NodeList を返します。

HTML中に1件しか対象がなくてもListで返ります。
inputs[0].style.padding = "140px";のようにして個々のElementを参照する必要があります。
※複数あるならループ回すとか、1件だけ選びたいならquerySelector()への変更を検討してください。

投稿2022/10/08 08:26

編集2022/10/08 08:28
m.ts10806

総合スコア80888

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

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

skillUp

2022/10/10 11:43

1つだけ選ぶのであればinputs[0]でも可能なのですね。 ありがとうございます。
m.ts10806

2022/10/10 23:19

変数がどういう情報を保持しているかデバッグで確認するようにしてみてください。 そうするとどういうプロパティを参照できるのかが見えてきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問