Search
ctrl/
Ask AI
Light
Dark
System

Types

The entire type system of EdgeDB is reflected in the e object, including scalar types, object types, and enums. These types are used in queries for thinks like casting and declaring parameters.

Copy
e.str;
e.bool;
e.int16;
e.int32;
e.int64;
e.float32;
e.float64;
e.bigint;
e.decimal;
e.datetime;
e.duration;
e.bytes;
e.json;
e.cal.local_datetime;
e.cal.local_date;
e.cal.local_time;
e.cal.relative_duration;
e.cal.date_duration;

e.Movie;    // user-defined object type
e.Genre;    // user-defined enum

You can construct array and tuple types, as in EdgeQL.

Copy
e.array(e.bool);
// array<bool>

e.tuple([e.str, e.int64]);
// tuple<str, int64>

e.tuple({
  name: e.str,
  age: e.int64
});
// tuple<name: str, age: int64>

These types can be used to cast one expression to another type.

Copy
e.cast(e.json, e.int64('123'));
// <json>'123'

e.cast(e.duration, e.str('127 hours'));
// <duration>'127 hours'

Scalar types like e.str serve a dual purpose. They can be used as functions to instantiate literals (e.str("hi")) or used as variables (e.cast(e.str, e.int64(123))).

You can use e.literal to create literals corresponding to collection types like tuples, arrays, and primitives. The first argument expects a type, the second expects a value of that type.

Copy
e.literal(e.str, "sup");
// equivalent to: e.str("sup")

e.literal(e.array(e.int16), [1, 2, 3]);
// <array<int16>>[1, 2, 3]

e.literal(e.tuple([e.str, e.int64]), ['baz', 9000]);
// <tuple<str, int64>>("Goku", 9000)

e.literal(
  e.tuple({name: e.str, power_level: e.int64}),
  {name: 'Goku', power_level: 9000}
);
// <tuple<name: str, power_level: bool>>("asdf", false)

Types are also necessary for declaring query parameters.

Pass strongly-typed parameters into your query with e.params.

Copy
const query = e.params({name: e.str}, params =>
  e.op(e.str("Yer a wizard, "), "++", params.name)
);

await query.run(client, {name: "Harry"});
// => "Yer a wizard, Harry"

The full documentation on using parameters is here.

Types are also used to write polymorphic queries. For full documentation on this, see Polymorphism in the e.select documentation.

Copy
e.select(e.Content, content => ({
  title: true,
  ...e.is(e.Movie, { release_year: true }),
  ...e.is(e.TVShow, { num_seasons: true }),
}));