Typescript 接口中的日期在检查时实际上是字符串

2024-04-15

不幸的是,重现这个问题的总代码会很广泛,所以我希望我的问题是显而易见的,我可以轻松提供。如果需要,我会发布更完整的解决方案。

首先,我定义一个接口:

export interface ITest {
    myDate: Date;
}

然后我创建一个数组用于测试:

export const TEST: ITest[]=[{myDate: new Date(1995, 8, 1)}]

我使用 Angular2 中的一个服务来公开这些内容,该服务正在访问 InMemoryDbServiceangular2-in-memory-web-api。我调用它并获取数组的代码如下:

get(): Promise<ITest[]>{
    return this.http.get(this.testUrl)
        .toPromise()
        .then(response => response.json().data as ITest[])
        .catch(this.handleError);
}

...然后我将其带入我的组件中:

    this.testService.get().then(tests => {
        this.tests = tests;
        console.log("Date Type:"+typeof(this.tests[0].myDate));
    });

这一切都很好,但问题是console.log那里显示的语句导致:

Date Type:string

其中的数据是正确的,因为我的日期保存的字符串是1995-09-01T07:00:00.000Z,但主要问题是 - 这不是Date它是一个string!在 VS Code 中,我什至获得了类似方法的代码补全toDateString但是当我执行它们时我(当然)得到toDateString is not a function.

我很确定问题是发生在response => response.json().data as ITest[],但是为什么日期数据没有被转换为实际的Date?我做错了,我明白。我应该如何处理这个问题,以便我可以让我的对象获得我期望的类型?


您正在使用一个界面并且类型断言 https://www.typescriptlang.org/docs/handbook/basic-types.html#type-assertions基本上告诉 TypeScript 该对象符合该接口。

但实际上情况并非如此,因为您正在转换的是一个 json 对象,其中“myDate”属性被表示为字符串。

使用类型断言不会以任何方式影响生成的 javascript 代码 - 您必须自己进行实际的类型转换。

之所以以字符串形式出现,是因为 JSON 格式中没有定义任何类型来表示 Date,因此服务器很可能只是发送 date.toString() 的结果。

一种选择是使用一个类来表示返回值并从 JSON 属性实例化一个对象,如下所示:

var response = JSON.parse(JSON.stringify({ myDate: new Date() }));

class Test  {
    constructor(json: { myDate: string }) {

        this.myDate = new Date(json.myDate);
    }

    myDate: Date;
}

let test = new Test(response);
console.log("Type: " + typeof (test.myDate));
console.log("Value: " + test.myDate);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Typescript 接口中的日期在检查时实际上是字符串 的相关文章

随机推荐