angular - Värde som returneras av API konverteras inte till Datum


I en Angular 7-applikation har jag följande modell:

public getTopPosts() {
  return this.httpClient.get<TopPostsResponse>>('top-posts');
}

Där TopPostsResponse är:

export interface TopPostsResponse {
  id: number;
  title: string;
  created: Date;
}

Jag anropar tjänsten i en komponentmetod:

getTopPosts(): Observable<PostModel[]> {

  return this.postService.getTopPosts().pipe(

    map((response: TopPostsResponse) => { 

      console.log(response.created);
      console.log(response.created instanceof Date);

      var created = new Date(response.created);
      console.log(created);
      console.log(created instanceof Date);

      return {
        id: response.id, 
        created: response.created,
        title: response.title
      };

    }));

}

Problemet är att när jag kontrollerar om response.created är ett datum får jag False:

console.log(response.created); >> 2019-01-24T13:03:10.123684
console.log(response.created instanceof Date); >> FALSE

var created = new Date(response.created); 
console.log(created); >> Thu Jan 24 2019 13:03:10 GMT+0000 (WET)
console.log(created instanceof Date); >> TRUE

Det verkar som att tjänsten inte konverterar värdet som returneras av API:et till en Datetyp men det är fortfarande ett giltigt datum eftersom jag kan skapa en instans av det.

Vad missar jag?

Svar #1

Typescript konverterar inte automatiskt rådata från förfrågan till en viss typ. Du måste tolka den själv.

return {
    id: response.id, 
    created: new Date(response.created),
    title: response.title
  };

Typescript-kompilatorn körs före byggnationen, inte vid körning. Så den vet inte vad som kommer att komma i svaret från API:et. Typescript-koden transpileras och sedan genereras en javascript-kod, så typkontrollen sker endast när du skriver koden. Därefter, när den verkligen körs, kommer den inte att analysera vilken typ av data som kommer från en extern källa.

Relaterade artiklar