Angularjs Typescript接口属性从camel大小写更改为Pascal大小写

Angularjs Typescript接口属性从camel大小写更改为Pascal大小写,angularjs,typescript,rxjs,Angularjs,Typescript,Rxjs,我正在ASP.NET 5应用程序中使用Angular 1.4和类型脚本以及RXJS。我有一个非常棘手的问题。在运行期间,我的所有接口属性都将从camel外壳转换为Pascal外壳。为什么会发生这种情况?如何避免这种情况 请注意,我使用承诺从web api获取数据,并进行如下调用 public GetDataFromAPI(request: Messages.IRequest): Observable<Messages.IResponse> { let result: IPro

我正在ASP.NET 5应用程序中使用Angular 1.4和类型脚本以及RXJS。我有一个非常棘手的问题。在运行期间,我的所有接口属性都将从camel外壳转换为Pascal外壳。为什么会发生这种情况?如何避免这种情况

请注意,我使用承诺从web api获取数据,并进行如下调用

public GetDataFromAPI(request: Messages.IRequest): Observable<Messages.IResponse> {
    let result: IPromise<Messages.IResponse>;
    result = this.$http.post("http://api.domain.com/GetData", request).then(
        (response: ng.IHttpPromiseCallbackArg<Messages.IResponse>) => {
            return response.data;
        }
    ); 
 return Observable.fromPromise(result).retry(3);
}
当我取回数据时,它的属性像这样具有可访问性

response.data.FirstName
response.data.LastName
response.data.Age

如果您的后端是WebApi,那么默认情况下,正常的Json序列化会保留c#或vb.net外壳中的字段

请参阅本文,将格式化程序配置为返回camel大小写


服务器很可能使用PascalCasing,您定义的接口与服务器返回的数据不匹配。TypeScript不会将成员名称从PascalCase转换为camelCase,您必须编写自己的逻辑。它也不会在运行时抛出错误,因为接口会被擦除。我建议您在TypeScript部分打破命名惯例,使用PascalCase字段,这样接口将与数据传输对象完全匹配。因此,定义如下所示的接口:

export interface IResponse {
    FirstName : string;
    LastName : string;
    Age : number;
}
并访问字段名,如
data.FirstName


另一种方法是更改服务器实现,正如Cleverguy25所建议的那样。

以下是需要配置的内容

HttpConfiguration config = new HttpConfiguration();
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.Formatting = Formatting.Indented;
HttpConfiguration config=new-HttpConfiguration();
var jsonFormatter=config.Formatters.OfType().First();
jsonFormatter.SerializerSettings.ContractResolver=新的CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.Formatting=Formatting.Indented;

后端必须返回带有此大小写字段的对象。检查开发工具的“网络”选项卡中的内容。它返回一个包含字段的对象,但所有字段名都是驼峰大小写的,这意味着如果我尝试访问数据。代码中的任何位置都将未定义firstName,但如果我写入数据。firstName可以工作(我不想这样做,因为typescript comiler在这种情况下会抛出错误),如果您的后端返回名为FirstName的字段的对象,则没有任何东西会神奇地将该字段转换为FirstName。在后端和前端采用一个约定,并坚持它。您当然可以进行此更改,但其他javascript程序员会想知道您为什么会打破约定:-(@Cleverguy25)这始终是一个很难做出的决定。在某些情况下,你甚至不允许更改服务器代码,因此你会陷入困境。在其他情况下,这只是品味的问题。
HttpConfiguration config = new HttpConfiguration();
var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
jsonFormatter.SerializerSettings.Formatting = Formatting.Indented;