Typescript -在后端和前端之间共享时,将mongoose ObjectId的类型转换为字符串

l2osamch  于 2022-11-13  发布在  Go
关注(0)|答案(1)|浏览(142)

我试图创建一些基于mongo模式模型的类型,并在mono repo中与前端共享相同的类型。
范例类型:

import { Types } from "mongoose";

export interface Profile {
  userId: Types.ObjectId;
  education: {
    university: Types.ObjectId;
  };
}

我的配置文件架构使用此配置文件接口来定义类型,并且在前端使用了相同的接口。由于前端不(需要)了解mongoose类型,我希望将userIdeducation.university作为字符串。顺便说一句,当我从前端服务器获得API响应时,我仅将这些值作为字符串。
我已经尝试了一个TSMap器,定义为here。这部分地解决了我的问题-我可以看到userId在前端被转换为字符串。但是这并不能解决嵌套对象education。我可以将education定义为单独的类型并使用Map器,但我认为这不是一种可伸缩的方式。我希望Map器也能处理嵌套类型的类型转换。
typeMapper.ts

import { Types } from "mongoose";

type MapObjectIdToString<PropType> = PropType extends Types.ObjectId
  ? string
  : PropType;

  export type MapDbObject<T> = {
    [PropertyKey in keyof T]: MapObjectIdToString<T[PropertyKey]>;
  };

我正在转换Profile类型,如下所示

export type UiProfile = MapDbObject<Profile>; // here `userId` is string, but `university` is still Types.ObjectId

是否有方法更新我的TS Mapper,将所有字段(包括嵌套对象中的字段)从Types.ObjectId转换为string?提前感谢!

azpvetkf

azpvetkf1#

递归类型可以做到这一点:

type StringIds<T> = T extends Types.ObjectId ? string : T extends Record<any, any> ? {
    [K in keyof T]: StringIds<T[K]>;
} : T;

也适用于数组。请在下面亲自尝试:
Playground

相关问题