TypeScript:从单个对象反序列化多个类型
我有一个序列化对象的JSON数组,每个对象都有一个TypeScript:从单个对象反序列化多个类型,typescript,Typescript,我有一个序列化对象的JSON数组,每个对象都有一个type字段。我正在尝试反序列化它们,但无法让TS配合: type serializedA={type:'A',aProp:string}; 甲级{ 公共类型='A'; 构造函数(数据:serializedA){} } 类型serializedB={type:'B',bProp:string}; B类{ 公共类型='B' 构造函数(数据:serializedB){} } const classMap={A,B}; 函数反序列化(serializ
type
字段。我正在尝试反序列化它们,但无法让TS配合:
type serializedA={type:'A',aProp:string};
甲级{
公共类型='A';
构造函数(数据:serializedA){}
}
类型serializedB={type:'B',bProp:string};
B类{
公共类型='B'
构造函数(数据:serializedB){}
}
const classMap={A,B};
函数反序列化(serializedObject:serializedA | serializedB){
const Klass=classMap[serializedObject.type];
新的Klass(项目);
}
问题是最后一行。TS不知道
Klass
和serializedObject
现在要么都是A
要么都是B
,我很难弄清楚如何告诉它。对于生产级解码库,请看以下内容:
type serializedA = { type: 'A', aProp: string };
class A {
public type='A';
constructor(data: serializedA) {}
}
type serializedB = { type: 'B', bProp: string };
class B {
public type ='B'
constructor(data: serializedB) {}
}
const classMap = { A, B };
function deserialize(serializedObject: serializedA | serializedB) {
if(serializedObject.type === "A"){
let Klass = classMap[serializedObject.type]
return new Klass(serializedObject);
} else {
let Klass = classMap[serializedObject.type]
return new Klass(serializedObject);
}
}
我们正在广泛使用io ts。你可以参考它是的,我正试图避免;)大约有50个不同的类,我不喜欢编写超级详细的代码只是为了让它们高兴。问题是
Klass
的构造签名是new(serializedA&serlializedB)=>A | B
,它简化为new(never)=>A | B
,因为类型{type:'A'&B',aProp string,bProp:string}
必须为空。这肯定很烦人,因为您知道得更清楚,但您必须使用类型断言或编写一系列测试,以将类型缩小到其各自的可能性。我支持io ts
,认为这是一个很好的选择。我们也专门使用它