#id #uuid


Make your IDs strongly typed!!

1 unstable release

0.1.0 Aug 29, 2022

#46 in #uuid

Download history 35/week @ 2022-12-03 5/week @ 2022-12-10 48/week @ 2022-12-17 44/week @ 2022-12-24 111/week @ 2022-12-31 27/week @ 2023-01-07 40/week @ 2023-01-14 4/week @ 2023-01-21 23/week @ 2023-01-28 36/week @ 2023-02-04 80/week @ 2023-02-11 57/week @ 2023-02-18 22/week @ 2023-02-25 18/week @ 2023-03-04 16/week @ 2023-03-11 7/week @ 2023-03-18

73 downloads per month


133 lines

Crates.io Documentation GitHub Workflows Coverage Status Maintenance


TypedId introduces a single type, aptly named TypedId. This is a generic wrapper any type, often types that you would use as an identifier. However, each instance of a TypedId has a free-generic parameter that you can use to associate that ID type to a given struct (or collection of structs).

This allows you to have an added layer of type-checked safety at compile time that disappears at run time! You can have all your types use the same underlying structure for their identifiers while never have to worry about swapping them around.

How it Works

TypedIds are very strange forward. The easiest way to use them is why declaring your own types that use TypedId. For example,

use typed_id::TypedId;

pub stuct Customer {
    id: CustomerId,
    /* Likely other fields */

pub type CustomerId = TypedId<u32, Customer>;

It's that simple! If you have other types that you need ids for, simply add another type and TypedId will handle all the boilerplate for you!

Note, that TypedId has an optional dependency on serde. When enabled, this adds an opinionated (de)serialization implementation. This implementation (de)serializes a TypedId as its underlying type.

Why use

Rust has a very powerful type system with many amazing properties. This leverages that system to prevent simple typos, such as passing in the wrong type to a function.


If you want to contribute to or improve upon this library, please do so. Fork this project or submit an issue or a pull request for a feature/fix/change/etc. All that I ask is for derived/iterative libraries to be open and free to use and ideally with the same license (LGPL v2.1). Any other application or library that uses this library can use any license.