Closed3
型を再定義するタイミングとは
スクラップテーマ
例えば、下記のようなAPIがあったとする。
type User = {
email: string
username: string
age: number
}
type Response = {
users: User[]
}
;(async () => {
await axios.get<Response>('api/v1/users')
})()
上記レスポンスを描画するためのコンポーネントが存在するとする。
export const Users: FC<Props> = (props) => {
return (
<ul>
{props.users.map(user => (
<li>
<div>{user.username}</div>
<div>{user.email}</div>
</li>
))}
</ul>
)
}
この時、コンポーネントのProps
の型定義はAPIのレスポンスを参照しておいた方がいいのか、それとも描画側として再度定義しておいた方がいいのか?
type Props = {
users: User[]
}
export const Users: FC<Props> = (props) => {
return (
<ul>
{props.users.map(user => (
<li>
<div>{user.username}</div>
<div>{user.email}</div>
</li>
))}
</ul>
)
}
もしAPIに破壊的変更が加わった場合。例えば下記のような変更だ。
// type User = {
// email: string
// username: string
// age: number
// }
type User = {
username: string
attr: {
email: string
age: number
}
}
この時、描画コンポーネントの変数呼び出しを直す必要が出てくる。
しかし描画側はこの破壊的変更に付き合う必要があるのだろうか?
この描画コンポーネントが汎用的に用いられているコンポーネントであある場合、影響範囲が広くなってしまう。
その場合、描画コンポーネント側では描画コンポーネントの定義を作り、propsの内容をラップするのが適切である気がする。
type Props = {
email: string
username: string
age: number
}
export const Users: FC<Props> = (props) => {
return (
<ul>
{props.users.map(user => (
<li>
<div>{user.username}</div>
<div>{user.email}</div>
</li>
))}
</ul>
)
}
type User = {
username: string
attr: {
email: string
age: number
}
}
type Response = {
users: User[]
}
;(async () => {
const res = await axios.get<Response>('api/v1/users')
const assginedUsers = res.data.users.map(user => ({
username: user.username,
email: user.attr.email,
age: user.attr.age
}))
})()
型を再定義するのはできるだけ避けたい私だが、情報と描画の型定義に関しては分けて管理した方が良いのでは?と感じました。
まぁAPIの破壊的変更はやめてくれって話なんですけど。
このスクラップは2021/10/12にクローズされました