fontcolor_theme
Deepkit Runtime Types

扩展

自定义序列化

你可以通过编写你自己的 Serializer 或扩展默认的 serializer 来扩展某个类型的序列化。

下面的示例展示了如何将类 Point 序列化/反序列化为元组 [number, number]

import { serializer, SerializationError } from '@deepkit/type';

class Point {
  constructor(public x: number, public y: number) {
  }
}

// 反序列化表示从 JSON 到(类)实例。
serializer.deserializeRegistry.registerClass(Point, (type, state) => {
  state.convert((v: any) => {
    // 如果它已经是 Point 实例,那就完成了
    if (v instanceof Point) return v;

    // 此时 `v` 可能是任意值(除了 undefined),因此需要进行检查
    if (!Array.isArray(v)) throw new SerializationError('Expected array');
    if (v.length !== 2) throw new SerializationError('Expected array with two elements');
    if (typeof v[0] !== 'number' || typeof v[1] !== 'number') throw new SerializationError('Expected array with two numbers');
    return new Point(v[0], v[1]);
  });
});

serializer.serializeRegistry.registerClass(Point, (type, state) => {
  state.convert((v: Point) => {
    // 此时 `v` 一定是 Point 实例
    return [v.x, v.y];
  });
});

// cast 和 deserialize 默认使用 `serializer`
const point = cast<Point>([1, 2], undefined, serializer);
expect(point).toBeInstanceOf(Point);
expect(point.x).toBe(1);
expect(point.y).toBe(2);

{
  expect(() => deserialize<Point>(['vbb'])).toThrowError(SerializationError);
  expect(() => deserialize<Point>(['vbb'])).toThrow('Expected array with two elements')
}

// serialize 默认使用 `serializer`
const json = serialize<Point>(point);
expect(json).toEqual([1, 2]);

请注意,这仅适用于常规的 @deepkit/type 函数,例如 castdeserializeserialize

这不会被传递到数据库层,因为数据库层在迁移和序列化时使用实体类中定义的类型(例如 BSON 序列化)。

English中文 (Chinese)한국어 (Korean)日本語 (Japanese)Deutsch (German)