我有一些JSON包含来自我客户端的匿名对象。是否有一些内置机制或外部库用于将这些匿名对象转换为强类型的TypeScript对象?是否有像AutoMapper这样的东西?
我的对象是复杂类型,复杂类型作为属性。
答案 0 :(得分:8)
获取一些示例数据并将其放在.ts文件中:
var people = [
{
"name": "bob", "height": 150, "pets": [{ "name": "spot", "species": "dog" }]
},
{
"name": "jane", "height": 142, "pets": [{ "name": "lucy", "species": "cat" }]
}
];
运行tsc --declaration yourFile.ts
现在你将拥有yourFile.d.ts
:
declare var people: {
"name": string;
"height": number;
"pets": {
"name": string;
"species": string;
}[];
}[];
将declare var people:
替换为interface Person
,删除尾随[]
,并(可选)删除引号:
interface Person {
name: string;
height: number;
pets: {
name: string;
species: string;
}[];
}
答案 1 :(得分:3)
最近,我在TypeScript / JavaScript中为此方案创建了一个AutoMapper实现。我把代码放在GitHub(AutoMapperTS)。您也可以使用automapper-ts NPM包或automapper-ts Bower包直接使用该库。
图书馆几乎完全记录在案。此外,已有相当多的Jasmine单元测试可用(代码覆盖率超过90%)。他们应该为您提供一些必要的解释。
我希望这个库适合您的需求。如果您有任何问题和/或评论,请不要犹豫与我联系!
快乐的编码!
答案 2 :(得分:1)
我一直在寻找一种简单的方法将json数据从Web服务转换为接口。没找到我需要的东西,但这是我的解决方案。注意到我添加了一个“Pet”界面,并为你的json添加了另一个宠物。还必须将匿名对象指定为“any”。您可以将其剪切/粘贴到TypeScript playground(http://www.typescriptlang.org/play/index.html)以查看结果。希望这会有所帮助。
let header = document.createElement("div");
header.textContent = "Test";
document.body.appendChild(header);
var people:any = [
{
"name": "bob", "height": 150, "pets": [{ "name": "spot", "species": "dog" }, {"name" : "violet", "species": "shark"}]
},
{
"name": "jane", "height": 142, "pets": [{ "name": "lucy", "species": "cat" }]
}
];
interface Pet {
name: string;
species: string;
}
interface Person {
name: string;
height: number;
pets: Array<Pet>
}
class Foo {
convertToObject = (person: Person) => person;
}
var person = new Foo().convertToObject(people[0]);
let div = document.createElement("div");
div.textContent = `hey ${person.name} I see you have ${person.pets.length} pet`;
document.body.appendChild(div);