Typescript类无法从对象访问属性

时间:2018-12-04 15:58:30

标签: typescript

export class Person {
    name: string;
    age: string;
    details: {
      occupation: string;
      height: string;
      gender: string;
    };
}

这是我在person.ts中定义的类。

在另一个文件中,我试图为新人员对象中的所有属性分配值。我可以访问nameage,但是我无法访问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";
  }

感谢您的帮助。

4 个答案:

答案 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", 
    }
  }