In Typescript how to fix Cannot set property 'first' of undefined

狂风中的少年 提交于 2020-02-12 02:58:25

问题


I'm trying to set a the sub property first that is defined in the Name interface but when do so I always get an error for example:

interface Name{
    first: string,
    last:string,
}

class Person{

    private name:Name

    public setName(firstName, lastName){
        this.name.first = firstName;
        this.name.last = lastName;
    }

}


var person1  = new Person();
person1.setName('Tracy','Herrera');

When running it i get the error: Cannot set property 'first' of undefined

Any one have an idea to work this out?


回答1:


Class properties are not automatically initialized on instantiation. You need to initialize them with the corresponding objects manually -- in this case, with an object containing the properties defined by its interface:

class Person {
    private name: Name;

    public setName(firstName, lastName) {
        this.name = {
            first: firstName,
            last: lastName
        };
    }
}

Another approach -- for example, in case there are multiple methods setting properties on the same object -- is to first initialize the property to an empty object, preferably in the constructor:

class Person {
    private name: Name;

    constructor() {
        this.name = {};
    }

    public setName(firstName, lastName) {
        this.name.first = firstName;
        this.name.last = lastName;
    }

    public setFirstName(firstName) {
        this.name.first = firstName;
    }
}

However, with the current setup this will yield a compile error when assigning {} to this.name, because the Name interface requires the presence of a first and a last property on the object. To overcome this error, one might resort to defining optional properties on an interface:

interface Name {
    first?: string;
    last?: string;
}



回答2:


You need to set name to an object of type Name (i.e. a shape matching that interface).

For example:

this.name = {
    first: 'John',
    last: 'Doe'
}



回答3:


if you want to have freedom, to make changes, separately you can do something like, using ?,

interface Name{
    first?: string;
    last? : string;
}

class Person{

    private name:Name

        public setName(firstName: string, lastName: string){
            this.name = { first: firstName, last: lastName };
        }

        public setNameSample(firstName: string){
            this.name = { first: firstName };
        }

        public setNameSample1(lastName: string){
            this.name = { last: lastName };
        }
}

In the above case if you do not use ? you would get something like in setNameSample for example if you need set only first :

Type '{ first: any; }' is not assignable to type 'Name'. Property 'last' is missing in

Note: I think the previous answer are the way to go, this is just an added.



来源:https://stackoverflow.com/questions/36196284/in-typescript-how-to-fix-cannot-set-property-first-of-undefined

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!