【发布时间】:2019-04-03 22:25:59
【问题描述】:
我正在将 C# 桌面应用程序重构为 Angular/TypeScript Web 应用程序。
C# 应用程序中的所有类属性都使用 PascalCase,所以我想,最好保留它。
这里有 2 个基本相同的 TypeScript 类的示例。第 1 个使用 PascalCase,第 2 个使用 camelCase:
//PascalCase
export class Info
{
public ManagedType:string;
public ApiTemplate:string;
}
//camelCase
export class Info
{
public managedType:string;
public apiTemplate:string;
}
这是奇怪的行为:
-
我从网络服务器加载 JSON 数据并创建上述 Info 类的数组。 TypeScript 类使用 PascalCase 还是 camelCase 似乎无关紧要。到目前为止,一切顺利。
this.Infos = await this.HttpClient.get<Info[]>(this.Url).toPromise<Info[]>(); 当我将数组记录到控制台时,我可以看到,无论 Info 类是使用 PascalCase 还是 camelCase,输出都使用 camelCase 作为属性。有点奇怪,但到目前为止还不错。
现在我变得奇怪了:当我使用 PascalCase 并过滤数组以获取 Info 类的一个特定实例时,结果始终为 undefined/null。 p>
-
当我使用 camelCase 过滤数组时,为了获取 Info 类的一个特定实例,结果被找到并正确。
//This doesn't work: Info is always undefinded, although the Array exists. let Info = Infos.filter(i => i.ManagedType == "Something" && i.ApiTemplate == "Something else")[0]; //This works: Info is found let Info = Infos.filter(i => i.managedType == "Something" && i.apiTemplate == "Something else")[0];
我的问题是:
为什么会这样?这是 TypeScript 问题还是 Angular 问题?
是否有我必须遵守的不成文约定?
为什么 TypeScript 编译器不抛出错误或警告,说明使用 PascalCase 可能无法正常工作?
【问题讨论】:
-
typescript 无论如何都不关心。最后它都被转换为javascript。我认为问题可能出在您的服务器在运行时返回的数据上。检查您的 http 请求以查看服务器如何发送数据并相应地命名您的属性。
-
到达的数据使用 camelCase,但我不明白,为什么存储数据的本地类(在 TypeScript/JavaScript 中定义)应该或必须使用与 JSON 文件相同的命名。这根本没有意义(除了自动映射)
-
您是使用 new 创建类的实例,还是直接使用服务器数据但断言类型为您定义的类型?如果您没有创建实例,您将获得 json 对象。 Typescript 仅在构建时出现,它被转译为 javascript,这就是在运行时运行的内容。
-
不,我没有使用 new() 并创建新实例。我直接使用服务器数据。代码如下所示: this.Infos = await this.HttpClient.get
(this.Url).toPromise (); -
@toskv 尚未测试,但这可能已经是答案了。我必须在不依赖自动映射的情况下迭代服务器数据并创建新实例。我会试试这个。非常奇怪的是,无论我使用 PascalCase 还是 camelCase,自动映射都能正常工作。在我看来,这应该会抛出一个错误,说数据无法正确映射。来自 C# 背景,这很奇怪。
标签: arrays angular typescript camelcasing pascalcasing