打字稿计算的getter不起作用

Ben*_*ins 9 properties typescript

这个计算属性lastSeenString过去对我有用:

export class User {
    public lastSeen?: Date;
    private _lastSeenString?:string = "";
    get lastSeenString():string {
        return Time.timeSince(this.lastSeen);
    }
}
Run Code Online (Sandbox Code Playgroud)

但现在lastSeenString回来了"".return从不调用getter中的语句.怎么会?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");
});
Run Code Online (Sandbox Code Playgroud)

我的打字稿编译成es5.为什么getter中的代码没有执行?

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

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";
    }
}
Run Code Online (Sandbox Code Playgroud)

User类的实际实现:

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")
}
Run Code Online (Sandbox Code Playgroud)

我看到实现有lastSeenString = "",但我认为这会触发getter而不仅仅是返回"".

更新:我非常确定它必须与导出该JSON对象并将其称为a User.我想我必须重新开始.

Tim*_*rry 16

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

目前,您只需构建一个vanilla JavaScript对象,然后告诉TypeScript它与真实User对象的形状相同.这会传递类型检查,因为它相同的形状 - 读取它上面的任何字段将返回与真实User对象相同类型的值 - 但这并不能告诉您有关这些类型的基本行为的信息领域.

  • 在这种情况下,不仅吸气剂和制定者都消失了,而且如果有的话,还有公共方法.另请查看[以下答案](http://stackoverflow.com/a/29759472/1886308)处理一致性问题.此外,最好不要在域实体中包含方法(以及getter和setter)以避免此问题. (2认同)