あるサイトのコードをそのままコピーして
画面が表示されるかテストしています。 リンク
Next.js × Typescriptのログイン画面になります。
login.tsxにおいて、以下のメッセージが表示されましたので
Type error: Type 'null' is not assignable to type 'string'.
18 | this.state = {
19 | credentials: {
20 | email: null,
| ^
21 | password: null,
22 | },
23 | isLoading: false,
8~11行目を以下のように修正しましたが
credentials: { email: string | any password: string | any }
今度は、別のエラーが発生します
Type error: Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{ email: any; password: any; }'.
No index signature with a parameter of type 'string' was found on type '{ email: any; password: any; }'.
27 | handleCredentialsChange = (e: React.ChangeEvent<HTMLInputElement>) => {
28 | let { credentials } = this.state
29 | credentials[e.target.name] = e.target.value
| ^
30 |
31 | this.setState({ credentials })
32 | }
どうすれば解消するのでしょうか
login
1import * as React from 'react' 2import Router from 'next/router' 3 4import Layout from '../Components/layout' 5 6interface LoginProps {} 7interface LoginState { 8 credentials: { 9 email: string | any 10 password: string | any 11 } 12 isLoading: boolean 13} 14 15class Login extends React.Component<LoginProps, LoginState> { 16 constructor(props: LoginProps) { 17 super(props) 18 this.state = { 19 credentials: { 20 email: null, 21 password: null, 22 }, 23 isLoading: false, 24 } 25 } 26 27 handleCredentialsChange = (e: React.ChangeEvent<HTMLInputElement>) => { 28 let { credentials } = this.state 29 credentials[e.target.name] = e.target.value 30 31 this.setState({ credentials }) 32 } 33 34 handleLoginSubmit = (e: React.MouseEvent<HTMLElement>) => { 35 e.preventDefault() 36 this.setState({ isLoading: true }) 37 38 setTimeout(() => { 39 this.setState({ isLoading: false }) 40 // ボタンを押された場合に /user へ画面遷移 41 Router.push('/user') 42 // Router.replace('/user') 43 }, 1000) 44 } 45 46 public render() { 47 return ( 48 <Layout title="Login" isHeader={false} isFooter={false}> 49 <form action=""> 50 <div className="login-area"> 51 <div> 52 <h1 className=""> 53 <img src="/static/yanatch_black.png" alt="my image" /> 54 </h1> 55 </div> 56 <article className="box is-rounded"> 57 <div className="field"> 58 <label className="label">Email</label> 59 <p className="control has-icons-left"> 60 <input className="input" type="email" placeholder="Email" /> 61 <span className="icon is-small is-left"> 62 <i className="fas fa-envelope"></i> 63 </span> 64 </p> 65 </div> 66 <div className="field"> 67 <label className="label">Password</label> 68 <p className="control has-icons-left"> 69 <input className="input" type="password" placeholder="Password" /> 70 <span className="icon is-small is-left"> 71 <i className="fa fa-lock"></i> 72 </span> 73 </p> 74 </div> 75 <div className="field"> 76 <p className=""> 77 <button className="button is-medium is-info is-fullwidth" onClick={this.handleLoginSubmit}> 78 ãƒã‚°ã‚¤ãƒ³ 79 </button> 80 </p> 81 </div> 82 </article> 83 </div> 84 </form> 85 <style jsx> 86 {` 87 .login-area { 88 margin: 0 auto; 89 min-width: 375px; 90 max-width: 400px; 91 } 92 .box { 93 padding-top: 3rem; 94 } 95 h1 { 96 padding: 3rem 6rem; 97 text-align: center; 98 } 99 100 .field { 101 padding-bottom: 1.5rem; 102 } 103 `} 104 </style> 105 </Layout> 106 ) 107 } 108} 109 110export default Login 111
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/03 04:19
退会済みユーザー
2021/10/03 05:39
2021/10/03 06:08