2017-02-20 69 views
0

如果我有一个父母和孩子打字稿对象:识别JSON亚型在打字稿

class Parent { 
    private parentField: string; 
} 

class Child extends Parent { 
    private childField: string; 
} 

现在我通过REST服务接收这两种类型的JSON对象的列表。

正常情况下,当我收到一个json对象时,我通过复制所有属性将它映射到一个打字稿对象。但在这种情况下,它并不那么简单,因为我不知道我正在处理哪个对象(它可以是Parent或Child)

将json类型和子类型映射到typescript的最佳方法是什么?

回答

3

首先,当你收到一个json的时候,它的确如此而不是包含你发布类型的对象。你有什么是类,并且jsons有对象。
如果你想输入你的JSON得到什么,那么:

interface Parent { 
    parentField: string; 
} 

interface Child extends Parent { 
    childField: string; 
} 

然后这是好的:

let json = { parent: { parentField: "a" }, child: { parentField: "a", childField: "b" } }; 
let parent: Parent = json.parent; 
let child: Child = json.child; 

如果您使用的类,那么你需要:

let parent = Object.assign(new Parent(), json.parent); 
let child = Object.assign(new Child(), json.child); 

要区别使用type guard

function isChild(obj: any): obj is Child { 
    return obj.childField != null; 
} 

if (isChild(json.obj)) { 
    // json obj is child 
} else { 
    // json obj is parent 
} 
+0

在这个用例中,你实际上知道你正在接收什么。我要求一种更一般的方式来做到这一点,因为我收到的是物品列表,而不是自己的物品 – iberbeu

+0

@iberbeu为什么你需要更通用的方式?难道你不能只为数组中的每个对象调用'isChild()'? –

+0

类型警卫是一种运行时检查来区分类型,它还告诉编译器该对象是某种类型的。什么可以比这更一般? –