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

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

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

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

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

Q&A

解決済

1回答

2389閲覧

TypeScript 型エラー

Patao150205

総合スコア10

JavaScript

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

TypeScript

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

React.js

Reactは、アプリケーションのインターフェースを構築するためのオープンソースJavaScriptライブラリです。

0グッド

0クリップ

投稿2021/03/21 00:38

前提・実現したいこと

謎の型エラーが発生して困っています。
TypeScriptとReactでシンプルなタイマーを作っていてスタート、ストップ、ポーズの至ってシンプルな構造です。

poseの関数を定義している中のclearIntervalの引数this.intervalIdでエラーが発生しています。
一方、componentWillUnmountのClearIntervalの引数this.intervalIdは、特にエラーなどは、発生していません。

なぜpose関数の方は、エラーが発生してしまっているのでしょうか?

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

No overload matches this call. Overload 1 of 2, '(intervalId: Timeout): void', gave the following error. Argument of type 'Timer | null' is not assignable to parameter of type 'Timeout'. Type 'null' is not assignable to type 'Timeout'. Overload 2 of 2, '(handle?: number | undefined): void', gave the following error. Argument of type 'Timer | null' is not assignable to parameter of type 'number | undefined'. Type 'null' is not assignable to type 'number | undefined'.ts(2769)

該当のソースコード

import { Component, ReactElement } from "react"; import './timer.css'; type Props = {limit: number} type State = {timeLeft: number} export default class Timer extends Component<Props, State> { intervalId: NodeJS.Timer | null = null; poseTime: number | null = null; constructor(props: Props) { super(props); this.state = { timeLeft: this.props.limit}; } componentDidUpdate = ():void => { const { timeLeft } = this.state; if (timeLeft === 0) {this.reset()}; }; componentWillUnmount = ():void => { if (this.intervalId) {clearInterval(this.intervalId)} }; tick = ():void => { this.setState((prevTime) => ({timeLeft : prevTime.timeLeft - 1})) }; start = (): void => { this.intervalId = setInterval(this.tick, 1000); }; pose = (): void => { clearInterval(this.intervalId); console.log(this.intervalId); const poseTime = this.state.timeLeft; } reset = ():void => { const limit = this.props.limit; this.setState({timeLeft: limit}); }; render = (): ReactElement => { const {timeLeft} = this.state; return( <div className="container"> <h1>タイマー</h1> <p className="countNum">{timeLeft}</p> <div className="btn-wrapper"> <button onClick={this.start}>START</button> <button onClick={this.reset}>RESET</button> <button onClick={this.pose}>POSE</button> </div> </div> ) } }

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

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

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

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

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

hoshi-takanori

2021/03/21 00:53

componentWillUnmount では null じゃないことを確認してから clearInterval を呼んでるけど、pose では確認してないからでしょうね。ちなみに、pose じゃなくて pause では。 https://www.e-bunpou.net/pause-pose.html
Patao150205

2021/03/21 00:57

型ガードでした。ありがとうございます! ほんまですね笑
guest

回答1

0

自己解決

型ガードを忘れずに書こう

投稿2021/03/21 01:01

Patao150205

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問