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

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

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

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

Q&A

解決済

1回答

7739閲覧

TypescriptのaddEventListener部分の記述でエラーが消えない

myc

総合スコア18

TypeScript

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

0グッド

0クリップ

投稿2021/01/25 12:51

編集2021/01/26 00:54

Typescript初学者です。
タブ切り替え機能を実装するJavascriptの記述をTypescriptに書き換えていますが、途中からエラーが消えなくて悩んでいます。
9行目のaddEventListener関数内、tabPanel以降がどうにもエラーが消えず、解決方法も見つからない状態です。
ざっくりした質問になってしまい申し訳ないのですが、「わからないポイントがわからない」状況から一歩も進めず困っています。。
どなたか解決策をご教示いただけますでしょうか。

typescript

1export function tabPanel():void { 2 const tabPanels:NodeListOf<HTMLElement> = document.querySelectorAll('.js-tab-panel'); 3 if(tabPanels.length) { 4 Array.prototype.forEach.call(tabPanels, (tabPanel:HTMLElement) => { 5 const tabGroup:HTMLElement = tabPanel.querySelector('.tab-group'); 6 const tabItems:NodeListOf<HTMLElement> = tabGroup.querySelectorAll('.tab-item'); 7 Array.prototype.forEach.call(tabItems, (tabItem:HTMLElement) => { 8 tabItem.addEventListener('click', { 9 tabPanel, 10 handleEvent: tabSwitch 11 }); 12 }); 13 }); 14 } 15 function tabSwitch(e){ 16 const targetTab = e.currentTarget; 17 const targetId = targetTab.querySelector('[data-target-panel]').dataset.targetPanel; 18 const targetPanel = this.tabPanel.querySelector('#'+targetId); 19 const currentTab = this.tabPanel.querySelector('.tab-group .is-active'); 20 const currentPanel = this.tabPanel.querySelector('.panel-group .is-active'); 21 currentTab.classList.remove('is-active'); 22 currentPanel.classList.remove('is-active'); 23 targetTab.classList.add('is-active'); 24 targetPanel.classList.add('is-active'); 25 } 26}

エラーメッセージ(9行目、tabPanel部分)

(property) tabPanel: HTMLElement
この呼び出しに一致するオーバーロードはありません。
2 中 1 のオーバーロード, '(type: "click", listener: (this: HTMLElement, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions): void' により、次のエラーが発生しました。
型 '{ tabPanel: HTMLElement; handleEvent: (e: any) => void; }' の引数を型 '(this: HTMLElement, ev: MouseEvent) => any' のパラメーターに割り当てることはできません。
オブジェクト リテラルは既知のプロパティのみ指定できます。'tabPanel' は型 '(this: HTMLElement, ev: MouseEvent) => any' に存在しません。
2 中 2 のオーバーロード, '(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void' により、次のエラーが発生しました。
型 '{ tabPanel: HTMLElement; handleEvent: (e: any) => void; }' の引数を型 'EventListenerOrEventListenerObject' のパラメーターに割り当てることはできません。
オブジェクト リテラルは既知のプロパティのみ指定できます。'tabPanel' は型 'EventListenerOrEventListenerObject' に存在しません。

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

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

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

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

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

myc

2021/01/26 00:52

addEventListenerの部分については、第二引数にオブジェクトを渡す方法をとっているため、TS化以前はエラーもなく正常に動作しておりました。 https://spelunker2.wordpress.com/2017/11/29/javascript%E3%81%AEaddeventlistener%E3%81%A7%E9%96%A2%E6%95%B0%E3%81%AB%E5%BC%95%E6%95%B0%E3%82%92%E6%B8%A1%E3%81%97%E3%81%A4%E3%81%A4%E8%A7%A3%E9%99%A4%E3%82%82%E3%81%97%E3%81%9F%E3%81%84/ エラーメッセージの添付を忘れていました、すみません。 tabPanelの部分については、 「(property) tabPanel: HTMLElement この呼び出しに一致するオーバーロードはありません。 2 中 1 のオーバーロード, '(type: "click", listener: (this: HTMLElement, ev: MouseEvent) => any, options?: boolean | AddEventListenerOptions): void' により、次のエラーが発生しました。 型 '{ tabPanel: HTMLElement; handleEvent: (e: any) => void; }' の引数を型 '(this: HTMLElement, ev: MouseEvent) => any' のパラメーターに割り当てることはできません。 オブジェクト リテラルは既知のプロパティのみ指定できます。'tabPanel' は型 '(this: HTMLElement, ev: MouseEvent) => any' に存在しません。 2 中 2 のオーバーロード, '(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void' により、次のエラーが発生しました。 型 '{ tabPanel: HTMLElement; handleEvent: (e: any) => void; }' の引数を型 'EventListenerOrEventListenerObject' のパラメーターに割り当てることはできません。 オブジェクト リテラルは既知のプロパティのみ指定できます。'tabPanel' は型 'EventListenerOrEventListenerObject' に存在しません。」 長いのですが、添付させていただきます。
guest

回答1

0

ベストアンサー

オブジェクト リテラルは既知のプロパティのみ指定できます。'tabPanel' は型 'EventListenerOrEventListenerObject' に存在しません。

エラーメッセージのとおり、イベントリスナオブジェクトには、{ handleEvent: (evt: Event) => void }しか渡すことができません。

https://github.com/microsoft/TypeScript/blob/master/lib/lib.dom.d.ts#L5424

以下のようにすればエラーは解消されるかと思います。

tabItem.addEventListener('click', { handleEvent: tabSwitch });

また、上記のコンパイルエラーとは関係ないですが、型アノテーションは削除し、TypeScriptが教えてくれる型を使用するほうが安全性が高まります。はオプショナルチェイニングと呼ばれるJavaScriptの新しい機能で、オブジェクトが存在しない場合でもプロパティに安全にアクセスできるようになります。

const tabGroup = tabPanel.querySelector(".tab-group"); const tabItems = tabGroup?.querySelectorAll(".tab-item"); tabItems?.forEach((tabItem) => { tabItem.addEventListener("click", { handleEvent: tabSwitch, }); });

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Optional_chaining

投稿2021/01/26 02:20

編集2021/01/26 02:38
uraway_

総合スコア116

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

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

myc

2021/01/26 03:41

ご解答ありがとうございます。 教えていただいた通りtabPanelを削除するとエラーは解消されましたが、肝心のタブ機能が機能しなくなりました… もう少し自分で調べてみようと思います。 ありがとうございました。
uraway_

2021/01/26 04:11

`tabSwitch`関数内で、`this.tabPanel`が取得できなくなったことが原因かと思います。(もとはオブジェクト内で渡していたがTypeScriptではできない) console.logなどでデバッグしてみてください。 querySelectorやclosestなどで、もう一度取得するのが早いかなと思います。頑張ってください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問