M05 Type Driven

作者 actionbook5c40d3ad7851无许可证1.5K 个星标收录于 2026年10月8日更新于 2026年10月8日仓库6周前更新

CRITICAL: Use for type-driven design. Triggers: type state, PhantomData, newtype, marker trait, builder pattern, make invalid states unrepresentable, compile-time validation, sealed trait, ZST, 类型状态, 新类型模式, 类型驱动设计

AI 生成的概览

指导 Rust 类型驱动设计,用类型让非法状态无法表示。

功能
该技能提供类型驱动设计指导,涵盖新类型、类型状态、PhantomData、标记 trait、构建器、密封 trait 和零大小类型等模式。它把设计问题归结为类型系统如何阻止非法状态,并给出错误到设计的问题提示、决策表和反模式对比。它还指向领域建模、trait 设计、错误处理和反模式等相关技能。
适用场景
适用于希望用编译期校验替代运行时检查的类型或 API 设计,例如编码不变量、建模状态机或包装基础类型以获得类型安全。也适合在 newtype、类型状态、构建器和标记 trait 之间做选择时使用。
运行要求
除智能体本身外无需任何工具、软件包或运行时;仅为说明性内容,不附带脚本。

Type-Driven Design

Layer 1: Language Mechanics

Core Question

How can the type system prevent invalid states?

Before reaching for runtime checks:

  • Can the compiler catch this error?
  • Can invalid states be unrepresentable?
  • Can the type encode the invariant?

Error → Design Question

PatternDon't Just SayAsk Instead
Primitive obsession"It's just a string"What does this value represent?
Boolean flags"Add an is_valid flag"Can states be types?
Optional everywhere"Check for None"Is absence really possible?
Validation at runtime"Return Err if invalid"Can we validate at construction?

Thinking Prompt

Before adding runtime validation:

  1. Can the type encode the constraint?

    • Numeric range → bounded types or newtypes
    • Valid states → type state pattern
    • Semantic meaning → newtype
  2. When is validation possible?

    • At construction → validated newtype
    • At state transition → type state
    • Only at runtime → Result with clear error
  3. Who needs to know the invariant?

    • Compiler → type-level encoding
    • API users → clear type signatures
    • Runtime only → documentation

Trace Up ↑

When type design is unclear:

"Need to validate email format"    ↑ Ask: Is this a domain value object?    ↑ Check: m09-domain (Email as Value Object)    ↑ Check: domain-* (validation requirements)
SituationTrace ToQuestion
What types to createm09-domainWhat's the domain model?
State machine designm09-domainWhat are valid transitions?
Marker trait usagem04-zero-costStatic or dynamic dispatch?

Trace Down ↓

From design to implementation:

"Need type-safe wrapper for primitives"    ↓ Newtype: struct UserId(u64);
"Need compile-time state validation"    ↓ Type State: Connection<Connected>
"Need to track phantom type parameters"    ↓ PhantomData: PhantomData<T>
"Need capability markers"    ↓ Marker Trait: trait Validated {}
"Need gradual construction"    ↓ Builder: Builder::new().field(x).build()

Quick Reference

PatternPurposeExample
NewtypeType safetystruct UserId(u64);
Type StateState machineConnection<Connected>
PhantomDataVariance/lifetimePhantomData<&'a T>
Marker TraitCapability flagtrait Validated {}
BuilderGradual constructionBuilder::new().name("x").build()
Sealed TraitPrevent external implmod private { pub trait Sealed {} }

Pattern Examples

Newtype

rust
struct Email(String);  // Not just any string
impl Email {    pub fn new(s: &str) -> Result<Self, ValidationError> {        // Validate once, trust forever        validate_email(s)?;        Ok(Self(s.to_string()))    }}

Type State

rust
struct Connection<State>(TcpStream, PhantomData<State>);
struct Disconnected;struct Connected;struct Authenticated;
impl Connection<Disconnected> {    fn connect(self) -> Connection<Connected> { ... }}
impl Connection<Connected> {    fn authenticate(self) -> Connection<Authenticated> { ... }}

Decision Guide

NeedPattern
Type safety for primitivesNewtype
Compile-time state validationType State
Lifetime/variance markersPhantomData
Capability flagsMarker Trait
Gradual constructionBuilder
Closed set of implsSealed Trait
Zero-sized type markerZST struct

Anti-Patterns

Anti-PatternWhy BadBetter
Boolean flags for statesRuntime errorsType state
String for semantic typesNo type safetyNewtype
Option for uninitializedUnclear invariantBuilder
Public fields with invariantsInvariant violationPrivate + validated new()

Related Skills

WhenSee
Domain modelingm09-domain
Trait designm04-zero-cost
Error handling in constructorsm06-error-handling
Anti-patternsm15-anti-pattern

来源与署名

来源:actionbook/rust-skills位于skills/m05-type-driven提交5c40d3a

许可证: 无许可证

内容归原作者所有。SourceWeft 从公开仓库中收录这些内容。

举报或申请下架