在Typescript中如何修复无法设置未定义

时间:2016-03-24 08:54:52

标签: interface typescript

我正在尝试设置first接口中定义的子属性Name但是这样做时我总是会收到错误,例如:

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');

运行时我收到错误:Cannot set property 'first' of undefined

任何人都有想法解决这个问题吗?

4 个答案:

答案 0 :(得分:25)

在实例化时不会自动初始化类属性。您需要手动使用相应的对象初始化它们 - 在这种情况下,使用包含其接口定义的属性的对象:

class Person {
    private name: Name;

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

另一种方法 - 例如,如果有多个方法在同一个对象上设置属性 - 首先将属性初始化为空对象,最好是在构造函数中:

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;
    }
}

但是,使用当前设置,在将{}分配给this.name时会产生编译错误,因为Name接口需要存在{ {1}}和对象上的first属性。要克服此错误,可以尝试在接口上定义可选属性:

last

答案 1 :(得分:5)

您需要将名称设置为名称类型的对象(即与该界面匹配的形状)。

例如:

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

答案 2 :(得分:2)

如果你想拥有自由,进行更改,你可以单独使用?

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 };
        }
}

在上述情况下,如果您不使用?,则可以获得setNameSample中的内容,例如,如果您只需要设置first

  

键入' {first:any; }'不能分配给姓名'姓名'。属性   '最后'

中缺少

注意:我认为之前的答案是要走的路,这只是一个补充。

答案 3 :(得分:0)

您也可以尝试

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

class Person{

    private name = {} as Name;

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

}


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