[解決済み] 未定義」の可能性があるオブジェクトを呼び出すことができません.ts(2722)
質問
ボタンコンポーネントを持っています。私はこのコンポーネントに、単に1つの
onClick
プロップは、私が定義した多くのオプションのプロップの中から選択します。
const Button = (props: ButtonProps) => {
const handleClick: React.MouseEventHandler<HTMLButtonElement | HTMLAnchorElement> = e => {
props.onClick(e);
}
return (
<StyledButton onClick={handleClick}>
{props.children}
</StyledButton>
);
};
それから、こんな風に使っています。
<Button onClick={(e) => {
console.log(e);
}}>Click me!</Button>
さて、質問にあるエラーのように、オブジェクトが未定義である可能性はどうでしょうか?私は明らかに関数を渡していますし、それも型定義に従って渡しています。つまり、私はオブジェクトを渡しているのです。単純なことです。
...
onClick?: React.MouseEventHandler<HTMLElement>
...
このプロジェクトでは、最近さらにいくつかの厳しいチェックを追加しています。
"strictFunctionTypes": true,
"strictNullChecks": true
strict:true
がすでに存在するため、このエラーは発生しませんでした。
ここで何が問題なのでしょうか?
アップデート - タイプを追加
export interface IBaseButtonProps {
type?: ButtonType;
disabled?: boolean;
size?: ButtonSize;
block?: boolean;
loading?: boolean | { delay?: number };
icon?: string;
className?: string;
prefixCls?: string;
children?: React.ReactNode;
}
export type AnchorButtonProps = {
href: string,
target?: string,
onClick: React.MouseEventHandler<HTMLElement>
} & IBaseButtonProps & Omit<React.AnchorHTMLAttributes<any>, 'type' | 'onClick'>;
export type NativeButtonProps = {
onClick: React.MouseEventHandler<HTMLElement>,
htmlType?: ButtonHTMLType
} & IBaseButtonProps & Omit<React.ButtonHTMLAttributes<any>, 'type' | 'onClick'>;
export type ButtonProps = Partial<AnchorButtonProps & NativeButtonProps>
注意事項
可能な解決策は、プロップを再構築し、デフォルトプロップを追加することです。あるいは
defaultProps
をReactから取得しました。しかし、Typescriptで本当にそれを要求すべきかどうかはわからない。
どのように解決するのですか?
<ブロッククオートさて、質問にあるように、オブジェクトが未定義である可能性があるのはなぜでしょうか?[sic]です。
の使用は
Partial<T>
を中心に
export type ButtonProps = Partial<AnchorButtonProps & NativeButtonProps>
原因
onClick
をオプションにすることができます。私たちが
Partial<T>
を受信すると、すべてのプロパティは
?
となり、オプションとなる。つまり、すべて未定義とすることができる。
修正には2つのアプローチがあり、1つは
ButtonProps
と同じです。
onClick
がオプションであることを確認し、さらに
onClick
を定義してから呼び出す(修正1)、もうひとつは
ButtonProps
を作るために
onClick
が必要です(修正2、3)。
修正1:
onClick
はオプションのまま
を使用します。
ButtonProps
を確認し、その後に
onClick
が定義されていることを確認してから呼び出す。これは
antdが行うこと
を、コメントでリンクしていただいたコードに追加しました。
const Button = (props: ButtonProps) => {
const handleClick: React.MouseEventHandler<
HTMLButtonElement | HTMLAnchorElement
> = e => {
if (props.onClick) props.onClick(e); // works
};
};
修正2
onClick
が必須となります。
変更
ButtonProps
を適用しないことで
Partial
を
NativeButtonProps
:
type ButtonProps1 = Partial<AnchorButtonProps> & NativeButtonProps;
const Button1 = (props: ButtonProps1) => {
const handleClick: React.MouseEventHandler<
HTMLButtonElement | HTMLAnchorElement
> = e => {
props.onClick(e); // works
};
};
3を修正する。
onClick
も必須となります。
を定義します。
RequireKeys
この型は、オプションでないキーを指定することができます。
type RequireKeys<T, TNames extends keyof T> = T &
{ [P in keyof T]-?: P extends TNames ? T[P] : never };
type ButtonProps2 = RequireKeys<ButtonProps, "onClick">;
const Button2 = (props: ButtonProps2) => {
const handleClick: React.MouseEventHandler<
HTMLButtonElement | HTMLAnchorElement
> = e => {
props.onClick(e); // works
};
};
の答えは
マッピングされた型:オプションのモディファイアを削除する
をどのように定義したかについては、さらに詳しい情報があります。
RequireKeys<T>
.
関連
-
[解決済み] react-router-domを使用する際に「Function components cannot be given refs」を回避するにはどうすればよいですか?
-
[解決済み] error 'document' is not defined : eslint / React
-
[解決済み] マテリアルUIセレクトフィールドのマルチセレクト
-
[解決済み] useStateプロパティのフックにmap関数を使用する方法
-
[解決済み] Webpack + Babelです。プリセット "es2015 "がディレクトリに相対して見つからなかった
-
[解決済み] react router dom v4でwebpack dev serverを構成する方法は?
-
[解決済み] ReactJs "インバリアント違反..." リアクトの古典的な問題
-
[解決済み] TypeScriptでオブジェクトに動的にプロパティを割り当てるには?
-
[解決済み] React - uncaught TypeError: 未定義のプロパティ 'setState' を読み取れない
-
[解決済み】「エラー TS2533: オブジェクトは 'null' または 'undefined' の可能性があります」を抑制する方法とは?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンポーネントの定義に表示名がない react/display-name
-
[解決済み】Warning.Itが表示されるのはなぜですか?Functions are not valid as a React child?
-
[解決済み] テスト
-
[解決済み] Jestの `beforeEach` グローバルは何のためにあるのですか?
-
[解決済み] マテリアルUIセレクトフィールドのマルチセレクト
-
[解決済み] React-Router 4 キャッチオールルート
-
[解決済み] ReactjsのEsLintの "react / jsx-props-no-spreading "エラーを無効化する。
-
[解決済み] componentWillReceiveProps は名称が変更されました。
-
[解決済み] axios-mock-adapter onGet mock data not effective.
-
[解決済み] 拡張子.tsと.tsxの違いは何ですか?どちらもreactのタイプスクリプトファイルの拡張子として使用されます。では、どこで使うべきなのでしょうか?