我在打字稿中有一个问题,即当我在控制台中登录时,对象的属性仍然给我未定义。这是我的课:
export class CustomerGroupModel {
public Id: number;
public Name: string;
public Active: boolean;
}
在addcustomersGroup.component.ts
:
public customersGroups : CustomerGroupModel[] = [];
let customerGroup = this.customersGroups[form.value.customer_group];
console.log(customerGroup);
console.log(customerGroup.Name);
输出是
{id: 2, name: "Group2", active: false, customers: Array(0)}
undefined
你似乎不明白的是,TypeScript 纯粹是一个编译器。运行时没有类型检查。因此,例如,这将在 TypeScript 中完美运行:
const foo: number = 1;
const bar: any = foo;
const baz: string = bar;
请参阅:您最终得到一个baz
类型为变量的变量string
,它实际上引用了一个数字。因为在运行时,它变成了普通的旧 JavaScript:
var foo = 1;
var bar = foo;
var baz = bar;
所以,当你写
public getCustomerGroups() {
return this.http.get<CustomerGroupModel[]>(this.baseUrl + "api/CustomerGroup/getallgroup");
}
你告诉 TypeScript 编译器:“相信我,由返回的 observable 发出的事件http.get()
是类型CustomerGroupModel[]
”。编译器无法检查这是否有意义,并且在运行时没有类型检查。就像前面的例子一样。
但这没有意义。http 所做的将它接收到的 json 字符串转换为 JavaScript 对象的所有操作都是return JSON.parse(string)
. 那不会,也永远不会返回CustomerGroupModel[]
. 拥有 实例的唯一方法CustomerGroupModel
是调用new CustomerGroupModel()
.
所以
CustomerGroupModel
一个接口,而不是一个类:它清楚地表明你实际上永远不会拥有作为类的实际实例的对象CustomerGroupModel
。仅具有与CustomerGroupModel
接口中定义的属性相同的属性的对象。id
, name
, active
, customers
。不是Id
, Name
, Active
。好消息是它还会让您遵守 TypeScript/JavaScript 命名约定。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句