Electron应用中如何用TypeScript共享序列化类接口避免重复签名?
解决方案:用TypeScript工具类型自动生成序列化接口
你可以通过自定义递归工具类型来基于原类自动生成序列化后的接口,完全避免重复编写类属性签名。核心思路是过滤掉类中的函数(及其他不可序列化的类型),并递归处理嵌套的类实例。
1. 定义递归序列化工具类型
先编写一个通用工具类型Serializable,它会自动剔除函数类型的属性,并递归处理嵌套的对象/类:
// 递归工具类型:过滤函数属性,处理嵌套对象 type Serializable<T> = { [K in keyof T as T[K] extends Function ? never : K]: T[K] extends object ? Serializable<T[K]> : T[K] };
as T[K] extends Function ? never : K:排除所有值为函数类型的属性- 递归逻辑:如果属性值是对象类型,就对其应用
Serializable,确保嵌套类也能被正确处理
2. 基于原类生成序列化接口
直接基于你已有的类,通过工具类型快速生成序列化接口,无需重复编写属性:
// 你的原始类定义 class C1 { prop1: string; prop2: string; func1: () => void; constructor(prop1: string, prop2: string) { this.prop1 = prop1; this.prop2 = prop2; this.func1 = () => console.log("func1"); } } class C2 { prop3: string; child1: C1; constructor(prop3: string, child1: C1) { this.prop3 = prop3; this.child1 = child1; } } // 自动生成序列化接口 type SerializableC1 = Serializable<C1>; type SerializableC2 = Serializable<C2>;
此时SerializableC2的类型结构完全符合你预期的序列化结果:
{ prop3: string; child1: { prop1: string; prop2: string; } }
3. 配套序列化函数(可选)
可以编写一个通用的序列化函数,确保运行时输出符合类型定义:
function serialize<T>(obj: T): Serializable<T> { // JSON.stringify会自动忽略函数,正好匹配我们的类型定义 return JSON.parse(JSON.stringify(obj)) as Serializable<T>; } // 使用示例 const c1Instance = new C1("foo", "bar"); const c2Instance = new C2("baz", c1Instance); const serialized = serialize(c2Instance); // serialized的类型自动推导为SerializableC2,结构完全符合预期
扩展说明
如果你的类包含其他不可序列化的类型(比如Date、Map),可以修改工具类型来适配:
// 扩展版:处理Date类型(转成字符串) type Serializable<T> = { [K in keyof T as T[K] extends Function ? never : K]: T[K] extends Date ? string : T[K] extends object ? Serializable<T[K]> : T[K] };
内容的提问来源于stack exchange,提问作者dododingo
相关产品推荐
相关产品推荐

