タプルを返すため、useState
関数を入力する方法を理解できません。本質的に、null
の初期値としてemail
を指定する必要があります。つまり、ここでは空の文字列を使用できないと仮定します。
次に、この状態値を更新するsetEmail
関数を使用して、電子メールを文字列として取り込みます。
理想的にはuseState
と入力したいので、メールは文字列か、可能であればnullのいずれかであると想定しています。現時点ではnull
としてのみ継承します
_import * as React from "react";
const { useState } = React;
function Example() {
const [state, setState] = useState({ email: null, password: null });
function setEmail(email: string) {
setState(prevState => ({ ...prevState, email }))
}
return <p>{state.email}</p>
}
_
関数の引数のsetEmail
は、useState()
で指定されたstring
の有効なタイプではないため、null
関数に対して次のエラーが返されます
_[ts]
Argument of type '(prevState: { email: null; password: null; }) => { email: string; password: null; }' is not assignable to parameter of type 'SetStateAction<{ email: null; password: null; }>'.
Type '(prevState: { email: null; password: null; }) => { email: string; password: null; }' is not assignable to type '(prevState: { email: null; password: null; }) => { email: null; password: null; }'.
Type '{ email: string; password: null; }' is not assignable to type '{ email: null; password: null; }'.
Types of property 'email' are incompatible.
Type 'string' is not assignable to type 'null'. [2345]
(parameter) prevState: {
email: null;
password: null;
}
_
tSマッピングタイプを使用して読みやすさを向上させ、null値よりも未定義を優先できます。
const { useState } = React;
function Example() {
const [state, setState] = useState<Partial<{email: string, password: string}>>();
function setEmail(email: string) {
setState(prevState => ({ ...prevState, email }))
}
return <p>{state.email | ""}</p>
}