静态类型的运行时验证
Runtypes 允许你获取那些没有保证的值,并检查它们是否符合某种类型 A。这是通过可组合的类型验证器来实现的,这些验证器涵盖原始类型、字面量、数组、元组、对象、联合类型、交叉类型等。
假设你有表示小行星、行星、飞船和船员的对象。在 TypeScript 中,你可以这样编写它们的类型:
type Vector = [number, number, number]
type Asteroid = {
type: "asteroid"
location: Vector
mass: number
}
type Planet = {
type: "planet"
location: Vector
mass: number
population: number
habitable: boolean
}
type Rank = "captain" | "first mate" | "officer" | "ensign"
type CrewMember = {
name: string
age: number
rank: Rank
home: Planet
}
type Ship = {
type: "ship"
location: Vector
mass: number
name: string
crew: CrewMember[]
}
type SpaceObject = Asteroid | Planet | Ship如果本应具有这些形状的对象是从某个外部来源(例如 JSON 文件)加载的,我们需要验证这些对象是否符合其规范。我们通过以非常直接的方式构建相应的 Runtype 来实现这一点:
…(有关更完整的版本,请参阅 examples 目录。)
现在,如果我们有一个假定的 SpaceObject,我们可以这样验证它:
// spaceObject: SpaceObject
const spaceObject = SpaceObject.check(value)如果该对象不符合类型规范,check 将抛出一个异常。
当验证失败时,你的 runtype 会抛出一个 ValidationError 对象,其中包含描述问题所在的详细信息。该对象中提供以下属性:
name:始终为 "ValidationError"message:一个 string,用于概括整体问题failure:一个 Failure,以结构化方式描述问题如果你想检查验证失败的原因,请查看 failure 对象:
code:一个 Failcode,大致对问题进行了分类message:一个 string,总体概括了问题expected:产生此失败的 runtype暂无开放 Issues,或尚未同步最近议题。