interface - 在 Typescript 中如何修复无法设置未定义的属性 'first'

标签 interface typescript

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

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

有人有解决这个问题的想法吗?

最佳答案

类属性不会在实例化时自动初始化。您需要使用相应的对象手动初始化它们——在本例中,使用一个包含由其接口(interface)定义的属性的对象:

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 接口(interface) < em>要求对象上存在firstlast 属性。要克服这个错误,可以求助于在接口(interface)上定义可选 属性:

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

关于interface - 在 Typescript 中如何修复无法设置未定义的属性 'first',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36196284/

相关文章:

oop - 何时使用接口(interface)或抽象类?何时使用两者?

c# - 如何强制继承类在 C# 中实现静态方法?

c# - 使用 List<T> 创建允许 T 的子类的接口(interface)

node.js - 子 package.json 中的根 package.json 未满足依赖关系

javascript - 如何在Gulp中复制不需要编译的文件?

java - 在Netbeans中,有没有一种方法可以显示类中的所有公共(public)变量和方法,而无需实际生成接口(interface)文件?

具有继承接口(interface)的Java重载方法

javascript - 使用 Input 组件的 Angular 传递数据

javascript - Angular 2 : Bind form context to ngTemplateOutlet

typescript - 如何准备 lib 以兼容 tree-shaking?