打字稿计算的getter不起作用

时间:2016-12-08 05:46:32

标签: typescript properties

此计算属性result = result.Concat(new[] { new V_Student_Attendace_DayWise()}); 曾经对我有用:

lastSeenString

但现在export class User { public lastSeen?: Date; private _lastSeenString?:string = ""; get lastSeenString():string { return Time.timeSince(this.lastSeen); } } 会返回lastSeenString。永远不会调用getter中的""语句。怎么会? return已填充。

客户端:

lastSeen

我的打字稿编译为it('Displays the user\'s "last seen"', () => { component.user.lastSeen = new Date(); fixture.detectChanges(); expect(component.user.lastSeenString).toBe("less than a minute ago"); expect(page.lastSeen.innerText).toBe("last seen less than a minute ago"); }); 。为什么getter中的代码没有执行?

应该执行但不执行的时间类:

es5

User类的实际实现:

export class Time {
    public static timeSince(date: Date) {
        let start = +new Date();
        let elapsed = +new Date() - start;
        var seconds = Math.floor((elapsed) / 1000);

        // var seconds = Math.floor((new Date() - +date) / 1000);

        //var seconds = Math.floor(((new Date().getTime()/1000) - +date))


        var interval = Math.floor(seconds / 31536000);

        if (interval > 1) {
            return interval + " years";
        }
        interval = Math.floor(seconds / 2592000);
        if (interval > 1) {
            return interval + " months";
        }
        interval = Math.floor(seconds / 86400);
        if (interval > 1) {
            return interval + " days";
        }
        interval = Math.floor(seconds / 3600);
        if (interval > 1) {
            return interval + " hours";
        }
        interval = Math.floor(seconds / 60);
        if (interval > 1) {
            return interval + " minutes";
        }
        return "less than a minute ago";
    }
}

我看到实现有export var SERENA: User = { id: 1, lastSeenString: "", lastSeen: new Date("October 13, 2016 11:13:00"), badges: ["active User", "helper"], memberSince: new Date("October 13, 2014") } ,但我认为这会触发getter,而不仅仅是返回lastSeenString = ""

更新:我非常确定只需导出该JSON对象并将其称为""即可。我想我必须重新开始。

2 个答案:

答案 0 :(得分:11)

getter是在User的原型上定义的 - 即作为类本身的一部分。您需要使用该类(例如使用new User())构建实例,以使getter正常工作。

目前,您只需构建一个vanilla JavaScript对象,然后告诉TypeScript它与真实User对象的形状相同。这传递了类型检查,因为它相同的形状 - 读取它上面的任何字段将返回与真正的User对象相同类型的值 - 但这并不能告诉你关于这些领域的潜在行为的任何事情。

答案 1 :(得分:3)

就我而言,我从网络获取对象数据为JSON。然后分配如下数据:

   let newUser = Object.assign(new User(), data)

我可以访问所有公共数据和函数,但无法访问此对象内对象的函数,getter和setter。所以我无法访问私人数据,即使我可以打印出来。

   class User {
      name: string
      state: UserState
    }

   class UserState {
      private _stateInfo: string
      getter()......
    }

所以我可以访问名称,并可以打印出state的数据。但无法访问state内的函数。

解决此问题的方法是在传递UserState对象的数据时初始化新的User对象。