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
Stringstring
strstring
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]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.

Implementations on Foreign Types§

source§

impl TypeDef for Path

source§

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

source§

impl TypeDef for NonZeroU32

source§

impl TypeDef for NonZeroIsize

source§

impl TypeDef for OsStr

source§

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

source§

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

source§

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

source§

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

source§

impl<T, E> TypeDef for Result<T, E>where T: TypeDef, E: 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 TypeDef for CStr

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<T> TypeDef for Option<T>where T: TypeDef,

source§

impl TypeDef for u32

source§

impl TypeDef for i16

source§

impl<T1, T2, T3> TypeDef for (T1, T2, T3)where T1: TypeDef, T2: TypeDef, T3: 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 TypeDef for i8

source§

impl TypeDef for u64

source§

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

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 TypeDef for isize

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 TypeDef for u16

source§

impl TypeDef for NonZeroI8

source§

impl TypeDef for ()

source§

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

source§

impl TypeDef for f64

source§

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

source§

impl TypeDef for NonZeroI16

source§

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

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 TypeDef for f32

source§

impl TypeDef for NonZeroU16

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 TypeDef for NonZeroU8

source§

impl TypeDef for str

source§

impl TypeDef for NonZeroI64

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 TypeDef for usize

source§

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

source§

impl TypeDef for NonZeroI32

source§

impl TypeDef for i64

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<T> TypeDef for &'static Twhere T: TypeDef + ?Sized,

source§

impl TypeDef for PathBuf

source§

impl TypeDef for OsString

source§

impl TypeDef for NonZeroU64

source§

impl TypeDef for u8

source§

impl<T, const N: usize> TypeDef for [T; N]where T: 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 TypeDef for String

source§

impl TypeDef for i32

source§

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

source§

impl TypeDef for CString

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, 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> TypeDef for (T1, T2, T3, T4)where T1: TypeDef, T2: TypeDef, T3: TypeDef, T4: TypeDef,

source§

impl TypeDef for NonZeroUsize

source§

impl TypeDef for bool

Implementors§