タイトルのとおりですが、私の用語の使い方が間違っていたらすみません。
tl;dr
TypeScriptの関数定義時にその引数の型が部分型であることを明示したい。
typescript
1const hoge = (prop: {hoge: string}) => prop.hoge
と、あったときに、hoge()関数の引数は、
{ hoge: string; }
に、一致している必要はなく、
{ hoge: string; piyo?: number; hogehoge: string[] }
のように、{hoge: string}
が含まれている部分型であることを明示したいです。
具体例
具体例は以下の用な感じです。
React,react-reduxを使用していますが、TypeScriptの話です(例が悪くてすみません)
formに関して、パスワードのバリデーションを与える以下のような場面に出くわしました。
typescript
1// form.tsx 2 3<UsernameForm validate={[required]} /> 4<MailForm validate={[required, checkEmail]} /> 5<PasswordForm validate={[required]} /> 6<VerifyPasswordForm validate={[required, checkPassword]} />
上のコードで、フォームに入力すると以下のようなデータが作られます。
allValues = { username: 'hoge', email: 'example@example.com', password: 'pass1', verifyPassword: 'pass1' };
バリデーションを作るためには、バリデーションごとに関数を用意します。
今回は「パスワード」と「チェック用のパスワード」が一致しているかどうかのバリデーションです。
// validate.ts export const passwordMatch = (value: string, allValues: { password: string }) => value !== allValues.password ? 'パスワードが一致しません' : undefined;
ここで、この関数の第二引数のallValues
の型ですが、これはフォームの組み合わせによって、
allValues = { username: string, email: string, password: string, verifyPassword: string };
だったり、
allValues = { id: number, password: string, verifyPassword: string };
だったりします。
上の関数定義では、エラーは出ないのですが、この関数のみを見た場合、「あれ、allValuesは
type allValues = { password: string }
という型じゃないといけないのか?」となってしまう気がします。
ここで明示的に、「必ず{password: string}は含むが、他のプロパティが含まれていてもいい」ことを示したいのですが、何か良い方法はありますでしょうか。
それとも、上のような関数の定義を見たときは、allValues
は「password: stringを含む何かの型なのだな」と判断するのが一般的なのでしょうか。
長くなってしまいましたが、どなたかご存知の方がいらっしゃればご教示願えませんでしょうか。
よろしくおねがいします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。