打字稿对象转换不起作用

Uel*_*mer 7 types typescript angular

我有一个HTTP API.我正在加载一组对象作为json.

我想要转换为Typescript对象,但是使用关键字"as"它不起作用,甚至不能在对象前面使用<Type>.

r.forEach(entry => {
    entry.creationDate = new Date(entry.creationDate.date);
    entry.creator = <User>entry.creator;
    return entry;
});
Run Code Online (Sandbox Code Playgroud)

在entry.creator转换后直接输出console.log输出一个普通的"对象".

有人可以给我一个建议吗?

小智 20

我一直在努力解决类似的问题,在我看来这是打字稿中的缺陷.当你像你一样做演员表时.或者像这样的示例代码:

class User {
    name: string;

    doConsole(): void {
        console.log(`Name: ${this.name}`);
    }
}

let userObj = { name: 'jose' };

let user = new User();
Object.assign(user, userObj);

user.doConsole();
Run Code Online (Sandbox Code Playgroud)

您会注意到doConsole将不是已转换对象中的函数.这就是生成的JS:

var User = (function () {
    function User(name) {
        this.name = name;
    }
    User.prototype.doConsole = function () {
        console.log("Name: " + this.name);
    };
    return User;
}());
var userObj = { name: 'jose' };
var user = userObj;
user.doConsole();
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,它不会使用您在进行强制转换时由类准备的原型函数.我的另一种选择是做这样的事情:

class User {
    name: string;

    doConsole(): void {
       console.log(`Name: ${this.name}`);
    }
}

let userObj = { name: 'jose' };

let user = new User();
Object.assign(user, userObj);

user.doConsole();
Run Code Online (Sandbox Code Playgroud)

这可以确保您使用原型函数,正如生成的JS所示:

var User = (function () {
    function User() {
    }
    User.prototype.doConsole = function () {
        console.log("Name: " + this.name);
    };
    return User;
}());
var userObj = { name: 'jose' };
var user = new User();
Object.assign(user, userObj);
user.doConsole();
Run Code Online (Sandbox Code Playgroud)

所以基本上我所说的是我同意你的意思,它应该像你一样工作,但是转换器不使用原型函数,所以它不起作用.

我希望这可以帮助你.

  • 很好的解决方法!我最初是.net,所以我不习惯这种胡扯。难以置信,如果它们不起作用,它们甚至具有“ T或&lt;T&gt;” (3认同)
  • 我不明白,我没有看到第一个代码块和第二个代码块之间有任何区别 (3认同)