Slide 28
Slide 28 text
28
型をどう担保するか
不要フィールドを落とすだけでなく、型変換も強制できる
zod
や valibot
は brand
を提供している
import * as v from "valibot"
const SearchCriteria = v.pipe(
v.object({ keyword: v.string(), area: v.string() }),
v.brand("SearchCriteria"),
)
type SearchCriteria = v.InferOutput
const oldCriteria: SearchCriteria = { keyword: "Session-IPA", area: "Kyoto", secret: "TSKaigi Kansai"};
// error: TS2353 [ERROR]: Object literal may only specify known properties, and 'secret' does not exist
// in type '{ keyword: string; area: string; } & Brand<"SearchCriteria">'.
const criteria: SearchCriteria = v.parse(SearchCriteria, {
keyword: "Session-IPA",
area: "Kyoto",
secret: "TSKaigi Kansai"
})