Static, not gradual.
Types are checked at compile time. There is no any, no implicit conversion, no escape hatch. If a value is i32, it is i32 for the rest of the program.
type Point = struct { x: i32, y: i32 }
type Shape = enum { Circle(f32), Rect(f32, f32) }
const ORIGIN: Point = Point { x: 0, y: 0 }
fn area(s: Shape) -> f32 {
match s {
Circle(r) => 3.14 * r * r,
Rect(w, h) => w * h,
}
}