export class Person {
name: string;
age: string;
details: {
occupation: string;
height: string;
gender: string;
};
}
这是我在person.ts中定义的类。
在另一个文件中,我试图为新人员对象中的所有属性分配值。我可以访问name
和age
,但是我无法访问setData()方法中的detail对象中的任何属性,因为details对象是未定义的。代码看起来像这样。
import { Person} from '../Classes/person';
export class AnotherClass{
private person1: Person;
constructor() {
this.person1= new Person();
}
private setData(){
this.person1.details.occupation = "doctor";
}
感谢您的帮助。
答案 0 :(得分:2)
您的打字稿类实际上只是在定义对象的预期形状。当前您没有为属性提供任何默认值,这就是发生这种情况的原因。有几种方法可以解决这个问题。
您可以将您的课程更新为:
let subviewLabels = view.subviews.filter({$0.isKind(of: UILabel.self)})
或:
UILabel
第二条声明说一个人将有一个细节对象。 details对象具有三个可选属性,该对象的默认值为空对象。
您遇到的问题是JavaScript的默认值为export class Person {
name: string;
age: string;
details: {
occupation: string;
height: string;
gender: string;
} = {
occupation: '',
height: '',
gender: ''
};
}
。在Typescript中,您说您希望details属性是具有职业,身高和性别属性的对象。如果创建一个Person对象并尝试为其分配其他内容,则Typescript编译器会抱怨。 但是 ,Typescript不会为您为该对象创建默认值。如果未另行指定,则默认值为export class Person {
name: string;
age: string;
details: {
occupation?: string;
height?: string;
gender?: string;
} = {};
}
。现在,当您创建Person类的新实例时,当前分配给details属性的默认值为undefined
。然后,当您尝试为undefined
上的属性分配值时,运行时会感到不满意。
以上两个示例均提供了details对象的默认值,从而消除了您遇到的问题。它们之间的区别是将默认值分配给默认对象的每个属性。第一个将为每个属性分配一个空字符串,第二个将具有一个不包含这些属性的对象。
在第一个示例中,您必须为每个属性提供一个带有空字符串的对象,就像在Typescript中声明每个属性都是必需的一样。通过在第二个示例中添加undefined
,即可声明不需要每个属性。
默认对象将没有这些属性,但是在JavaScript中,当您尝试为该对象上尚不存在的属性分配值时,JavaScript会在该对象上创建该属性并将值分配给该对象
或者您可以按照其他答案中的建议进行操作,然后将一个对象分配给details属性。
答案 1 :(得分:1)
您刚刚在人身上声明了details
字段,没有将其初始化为对象,这意味着details
将无法使用,并且当您尝试设置默认字段时会出现错误。您应该在setData
export class AnotherClass{
private person1: Person;
constructor() {
this.person1= new Person();
}
private setData(){
this.person1.details = {
occupation: "doctor",
height: 10,
gender: 'female'
}
}
}
答案 2 :(得分:1)
在创建新实例时,请确保details对象得到初始化。因此,在构造函数中,设置结构。
export class Person {
name: string;
age: string;
details: {
occupation: string;
height: string;
gender: string;
};
constructor() {
this.details = {
occupation: null,
height: null,
gender: null,
};
}
}
答案 3 :(得分:1)
您需要将详细信息分配为对象
private setData(){
this.person1.details = {
occupation: "doctor",
}
}