2017-07-13 72 views
1

比方说,我想从Visual Studio TFS数据和响应(如JSON)是这样的格式:的Json属性别名在打字稿

{ 
    "Microsoft.VSTS.Scheduling.StoryPoints": 3.0, 
    // ...... 
} 

有一个在属性名点。其他问题读我发现我可以用一个接口这样

export interface IStory { // I don't think this kind of interface do me any help 
    "Microsoft.VSTS.Scheduling.StoryPoints": number 
} 

阅读打字稿是JSON,然后我可以使用属性与此语法:

var story = GetStoryFromTFS(); 
console.log(story["Microsoft.VSTS.Scheduling.StoryPoints"]); 

但我不要像这样调用属性,因为intellisense将无法帮助我找到我想使用的属性(因为我使用字符串调用属性)。

在C#中有一个JsonProperty属性,它使我能够创建这样一个模型:

public class Story 
{ 
    [JsonProperty(PropertyName = "Microsoft.VSTS.Scheduling.StoryPoints")] 
    public double StoryPoints { get; set; } 
} 

,然后我可以使用属性是这样的:

var story = GetStoryFromTFS(); 
Console.WriteLine(story.StoryPoints); 

这样的智能感知会能够帮助我找到我想要使用的属性。

在打字稿中是否有类似JsonProperty的属性?或者还有其他更好的方法来实现这种打字稿吗?

+1

有没有办法创建别名,你可以使用getter和setter来制作一个装饰服务器数据的类,但是这是很多为一些服务器数据编写的代码。如果有一条规则,我不应该更改从api检索到的json数据的属性名称,那么在打字稿中没有解决方法,那么更简单的方法是使用更简单的名称作为您的json属性 – toskv

+0

@toskv? – samAlvin

+2

你只能做js中你可以做的事情,而且要么将它包装在其他东西中,要么只是将它复制到另一个具有你喜欢的属性的对象。如果属性的名称设置为石头,那么你没有很多选择.. – toskv

回答

0

你有很多选择。请记住,所有这些选项都要求您将原始数据传递给将访问它的类。

映射值。

class StoryMap { 
    constructor(data: IStory) { 
     this.StoryPoints = data["Microsoft.VSTS.Scheduling.StoryPoints"]; 
    } 

    StoryPoints: number; 
} 

包装数据。

class StoryWrap { 
    constructor(private data: IStory) {} 

    get StoryPoints(): number { return this.data["Microsoft.VSTS.Scheduling.StoryPoints"] }; 
} 

构建一个装饰器来映射数据。

function JsonProperty(name: string) { 
    return function DoJsonProperty(target: any, propertyKey: string, descriptor: PropertyDescriptor) { 
     descriptor.get = function() { 
      return this.data[name]; 
     } 
     descriptor.set = function (value) { 
      this.data[name] = value; 
     } 
    } 
} 

class StoryDecorator 
{ 
    constructor(private data: IStory) {} 

    @JsonProperty("Microsoft.VSTS.Scheduling.StoryPoints") 
    get StoryPoints(): number { return 0 }; 

}