pub trait TypeDef: 'static {
    const INFO: TypeInfo;
}
Expand description

A Rust type that has a corresponding TypeScript type definition.

For a Rust type T, the TypeDef trait defines a TypeScript type which describes JavaScript value that are equivalents of Rust values of type T as encoded to JSON using serde_json. The types are one-to-one, so decoding from TypeScript to JSON to Rust also works.

§Implementing

§Local Types

To derive this trait for your own types, use the #[derive(TypeDef)] macro.

§Foreign Types

To use types from external crates in your own types, the recommended approach is to create a newtype wrapper and use the #[type_def(type_of = "T")] attribute to specify its type:

use serde::{Deserialize, Serialize};
use typescript_type_def::{write_definition_file, TypeDef};

// The Uuid type from the uuid crate does not implement TypeDef
// But we know that it serializes to just a string
#[derive(
    Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, TypeDef,
)]
#[serde(transparent)]
pub struct Uuid(#[type_def(type_of = "String")] pub uuid::Uuid);

// We can now use our newtype in place of the foreign type
#[derive(Debug, Serialize, Deserialize, TypeDef)]
pub struct User {
    pub id: Uuid,
    pub name: String,
}

let ts_module = {
    let mut buf = Vec::new();
    write_definition_file::<_, User>(&mut buf, Default::default()).unwrap();
    String::from_utf8(buf).unwrap()
};
assert_eq!(
    ts_module,
    r#"// AUTO-GENERATED by typescript-type-def

export default types;
export namespace types {
    export type Uuid = string;
    export type User = {
        "id": types.Uuid;
        "name": string;
    };
}
"#
);

The other option if you don’t want to create a newtype is to use #[type_def(type_of = "T")] everywhere you use the type:

use serde::{Deserialize, Serialize};
use typescript_type_def::{write_definition_file, TypeDef};

#[derive(Debug, Serialize, Deserialize, TypeDef)]
pub struct User {
    #[type_def(type_of = "String")]
    pub id: uuid::Uuid,
    pub name: String,
}

let ts_module = {
    let mut buf = Vec::new();
    write_definition_file::<_, User>(&mut buf, Default::default()).unwrap();
    String::from_utf8(buf).unwrap()
};
assert_eq!(
    ts_module,
    r#"// AUTO-GENERATED by typescript-type-def

export default types;
export namespace types {
    export type User = {
        "id": string;
        "name": string;
    };
}
"#
);

§std Types

TypeDef is implemented for std types as follows:

Rust typeTypeScript type
boolboolean
String, strstring
charstring
PathBuf, Pathstring
CString, CStr, OsString, OsStrstring
IpAddr, Ipv4Addr, Ipv6Addrstring
numeric typesnumber1
()null
(A, B, C)[A, B, C]
[T; N][T, T, ..., T] (an N-tuple)
Option<T>T | null
Vec<T>, [T]T[]
HashSet<T>T[]
BTreeSet<T>T[]
HashMap<K, V>Record<K, V>
BTreeMap<K, V>Record<K, V>
&'static TT
Box<T>T
Cow<'static, T>T
PhantomData<T>T
Result<T, E>{ Ok: T } | { Err: E }

§[serde_json] Types

TypeDef is implemented for types from the [serde_json] crate (when the json_value crate feature is enabled) as follows:

Rust typeTypeScript type
Valuenull |
boolean |
number |
string |
JSONValue[] |
{ [key: string]: JSONValue; }
Map<K, V>Record<K, V>
Numbernumber

  1. std numeric types are emitted as named aliases converted to PascalCase (e.g. Usize, I32, F64, NonZeroI8, etc.). Since they are simple aliases, they do not enforce anything in TypeScript about the Rust types’ numeric bounds, but serve to document their intended range. 

Required Associated Constants§

source

const INFO: TypeInfo

A constant value describing the structure of this type.

This type information is used to emit a TypeScript type definition.

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl TypeDef for IpAddr

source§

impl TypeDef for bool

source§

impl TypeDef for char

source§

impl TypeDef for f32

source§

impl TypeDef for f64

source§

impl TypeDef for i8

source§

impl TypeDef for i16

source§

impl TypeDef for i32

source§

impl TypeDef for i64

source§

impl TypeDef for isize

source§

impl TypeDef for str

source§

impl TypeDef for u8

source§

impl TypeDef for u16

source§

impl TypeDef for u32

source§

impl TypeDef for u64

source§

impl TypeDef for ()

source§

impl TypeDef for usize

source§

impl TypeDef for CString

source§

impl TypeDef for String

source§

impl TypeDef for CStr

source§

impl TypeDef for Ipv4Addr

source§

impl TypeDef for Ipv6Addr

source§

impl TypeDef for OsStr

source§

impl TypeDef for OsString

source§

impl TypeDef for Path

source§

impl TypeDef for PathBuf

source§

impl TypeDef for NonZeroI8

source§

impl TypeDef for NonZeroI16

source§

impl TypeDef for NonZeroI32

source§

impl TypeDef for NonZeroI64

source§

impl TypeDef for NonZeroIsize

source§

impl TypeDef for NonZeroU8

source§

impl TypeDef for NonZeroU16

source§

impl TypeDef for NonZeroU32

source§

impl TypeDef for NonZeroU64

source§

impl TypeDef for NonZeroUsize

source§

impl<K, V> TypeDef for BTreeMap<K, V>
where K: TypeDef, V: TypeDef,

source§

impl<K, V, S> TypeDef for HashMap<K, V, S>
where K: TypeDef, V: TypeDef, S: 'static,

source§

impl<T1> TypeDef for (T1,)
where T1: TypeDef,

source§

impl<T1, T2> TypeDef for (T1, T2)
where T1: TypeDef, T2: TypeDef,

source§

impl<T1, T2, T3> TypeDef for (T1, T2, T3)
where T1: TypeDef, T2: TypeDef, T3: TypeDef,

source§

impl<T1, T2, T3, T4> TypeDef for (T1, T2, T3, T4)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef,

source§

impl<T1, T2, T3, T4, T5> TypeDef for (T1, T2, T3, T4, T5)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6> TypeDef for (T1, T2, T3, T4, T5, T6)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7> TypeDef for (T1, T2, T3, T4, T5, T6, T7)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef, T12: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef, T12: TypeDef, T13: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef, T12: TypeDef, T13: TypeDef, T14: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef, T12: TypeDef, T13: TypeDef, T14: TypeDef, T15: TypeDef,

source§

impl<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> TypeDef for (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16)
where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef, T5: TypeDef, T6: TypeDef, T7: TypeDef, T8: TypeDef, T9: TypeDef, T10: TypeDef, T11: TypeDef, T12: TypeDef, T13: TypeDef, T14: TypeDef, T15: TypeDef, T16: TypeDef,

source§

impl<T> TypeDef for Cow<'static, T>
where T: Clone + TypeDef + ?Sized,

source§

impl<T> TypeDef for Option<T>
where T: TypeDef,

source§

impl<T> TypeDef for &'static T
where T: TypeDef + ?Sized,

source§

impl<T> TypeDef for [T]
where T: TypeDef,

source§

impl<T> TypeDef for Box<T>
where T: TypeDef + ?Sized,

source§

impl<T> TypeDef for BTreeSet<T>
where T: TypeDef,

source§

impl<T> TypeDef for Vec<T>
where T: TypeDef,

source§

impl<T> TypeDef for PhantomData<T>
where T: TypeDef + ?Sized,

source§

impl<T, E> TypeDef for Result<T, E>
where T: TypeDef, E: TypeDef,

source§

impl<T, S> TypeDef for HashSet<T, S>
where T: TypeDef, S: 'static,

source§

impl<T, const N: usize> TypeDef for [T; N]
where T: TypeDef,

Implementors§