首页 > 解决方案 > 无法读取未定义的属性 - 类中的方法调用

问题描述

我有一个包含以下内容的打字稿类

getOrgList(oo: fhir.Organization) {
    var olist: orgRoles[] = [];
    var filtered = oo.extension.filter(this.getRoleExt);

    filtered.forEach(function (value) {
        var org = new orgRoles();
        value.extension.forEach(function (innerValue) {
            switch (innerValue.url) {
                case 'role':
                    org.roleName = innerValue.valueCoding.display;
                    break;
                case 'primaryRole':
                    org.primaryRole = innerValue.valueBoolean;
                    break;
                case 'activePeriod':
                    var periodType = innerValue.valuePeriod.extension[0].valueString;
                    var periodExt = innerValue.valuePeriod;
                    var periodDisplay= this.getPeriodDisplay(periodExt);
                    break;
                case 'status':
                    org.activeStatus = innerValue.valueString;
                    break;
            }
        });

        olist.push(org);
    });

    return olist;
}

这目前在线上失败

var periodDisplay= this.getPeriodDisplay(periodExt);

有错误

 ERROR TypeError: Cannot read property 'getPeriodDisplay' of undefined

但是,getPeriodDisplay 被定义为同一类中的下一个方法。

getPeriodDisplay(pp) {
    return "++++";
}

我有其他代码从类外部调用 getPeriodDisplay(),但是从类中的不同方法调用它似乎会导致问题

关于我应该如何解决这个问题的任何想法?

标签: typescriptthis

解决方案


您需要为箭头函数切换常规函数才能访问正确的this(类实例):

getOrgList(oo: fhir.Organization) {
    var olist: orgRoles[] = [];
    var filtered = oo.extension.filter(this.getRoleExt);

    filtered.forEach((value) => {
        var org = new orgRoles();
        value.extension.forEach((innerValue) => {
            switch (innerValue.url) {
                case 'role':
                    org.roleName = innerValue.valueCoding.display;
                    break;
                case 'primaryRole':
                    org.primaryRole = innerValue.valueBoolean;
                    break;
                case 'activePeriod':
                    var periodType = innerValue.valuePeriod.extension[0].valueString;
                    var periodExt = innerValue.valuePeriod;
                    var periodDisplay= this.getPeriodDisplay(periodExt);
                    break;
                case 'status':
                    org.activeStatus = innerValue.valueString;
                    break;
            }
        });

        olist.push(org);
    });

    return olist;
}

推荐阅读