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

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

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

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

React.js

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

Q&A

解決済

1回答

3657閲覧

ReactでTypescriptを使用した際、useStateのsetがundefined' の可能性があるオブジェクトを呼び出すことはできません。

hiromiromi

総合スコア16

TypeScript

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

React.js

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

0グッド

0クリップ

投稿2021/11/06 01:17

前提・実現したいこと

Contextを使用してboolean型のフラグ管理をしようと考えています

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

TypeScript error in /src/components/Header.tsx(15,33): Cannot invoke an object which is possibly 'undefined'. TS2722

該当のソースコード

LogoFlugProvider.tsx

1import { createContext, useState, FC } from "react"; 2 3type Props = { 4 logoFlug: boolean, 5 setLogoFlug: Function, 6}; 7export const LogoFlugContext = createContext<Partial<Props>>(({})); 8 9 10export const LogoFlugProvider: FC = props => { 11 const { children } = props; 12 13 const [ logoFlug, setLogoFlug ] = useState(false); 14 15 return ( 16 <LogoFlugContext.Provider value={{ logoFlug, setLogoFlug }}> 17 { children } 18 </LogoFlugContext.Provider> 19 ); 20}; 21

該当のソースコード

Header.tsx

1import { FC, useContext } from 'react'; 2import { LogoFlugContext } from '../providers/LogoFlugProvider'; 3 4export const Header: FC = () => { 5 6 7 const { logoFlug, setLogoFlug } = useContext(LogoFlugContext); 8 console.log(logoFlug); 9 const onClickSwitch = () => setLogoFlug(!logoFlug); 10 11 12 13 return ( 14 <header> 15 <button onClick={onClickSwitch}>テスト</button> 16 </header> 17 ); 18}; 19

補足情報

TypeScriptを使用しない場合動作することは確認しました。
LogoFlugProvider.tsxにtype Props = {
logoFlug: boolean,
setLogoFlug: Function,
};
を宣言しましたがvalue={{ logoFlug, setLogoFlug }}がなぜかsetLogoFlug?: Function | undefinedとなってしまい

Header.tsxでsetLogoFlugが使用できません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パッと見で、エラーになる原因は、createContextのところで、Propsではなく、これのPartialを型パラメータに渡しているからっぽいです。なので

diff

1- export const LogoFlugContext = createContext<Partial<Props>>(({})); 2+ export const LogoFlugContext = createContext<Props>({ logoFlug: flase, setLogoFlug: () => {} });

としてみたりすると、どうでしょう?

投稿2021/11/06 01:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hiromiromi

2021/11/06 01:32

解決しました!! ありがとうございます。勉強不足でした
退会済みユーザー

退会済みユーザー

2021/11/06 01:37

????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問