Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript:从单个对象反序列化多个类型_Typescript - Fatal编程技术网

TypeScript:从单个对象反序列化多个类型

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

我有一个序列化对象的JSON数组,每个对象都有一个
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
,认为这是一个很好的选择。我们也专门使用它