我有以下对象,其结果是从RxJs订阅方法返回的值:
result: any
{
message: null
role: Object
success: true
}
我在TypeScript中将其转换为MyResponse
类型:
export class BaseResponse {
public Message: string = null;
public Success: boolean = null;
}
export class MyResponse extends BaseResponse {
public Role: Role = new Role();
}
..
getModel() {
this.roleService.get(this.id).subscribe(
result => {
let getResponse: MyResponse = <MyResponse>result;
console.log(getResponse.Role.ApplicationId); // <-- null reference error
},
error => { },
() => {
}
);
}
问题是在Chrome调试器中查看getResponse
对象时,对象的属性首字母是小写的。它不应该是大写的吗?我可以把它做成大写吗?
getResponse
{
role: Object,
message: null,
success: true
}
答案 0 :(得分:0)
<>
运算符不类型转换,因为TypeScript&#34;不存在&#34;在运行时不再。仅在编译时。它是类型断言。
所以
let getResponse: MyResponse = <MyResponse>result;
不更改值。它只会告诉编译器它应该推断出MyResponse
类型。因此,如果来自服务器的响应具有大写属性,则它们仍将在运行时大写。如果您希望它们是小写的,则需要应用转换函数。
您可以在此处详细了解类型断言:https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html
编辑:您更新了问题,我将在下面添加更多信息。
即使您将MyResponse
定义为class
,TypeScript也不会在您的代码中使用它(设置getResponse
时)。 TypeScript将使用该类作为接口。因此,public Role: Role = new Role();
不会被执行。如果要初始化此属性,则必须创建一个新实例,例如new MyResponse()
。
它不应该是大写的吗?我可以把它做成大写吗?
在JavaScript中,土地对象属性通常是小写的。但是使用一些C#后端我也习惯了大写属性;)所以这是你的决定。