简体   繁体   English

类型“对象”上不存在属性 - 联合类型

[英]Property does not exist on type 'object' - Union type

I have defined two interfaces:我定义了两个接口:

interface movieProps {
  adult: boolean,
  backdrop_path: string,
  genre_ids: number[],
  id: number,
  original_language: string,
  original_title: string,
  overview: string,
  popularity: number,
  poster_path: string,
  release_date: string,
  title: string,
  video: boolean,
  vote_average: number,
  vote_count: number,
  mediaType: string,
  documentID: string
}

interface gameReleaseDate {
  id: number,
  category: number,
  created_at: number,
  date: number,
  game: game,
  human: string,
  m: number,
  platform: number,
  region: number,
  updated_at: number,
  y: number,
  documentID: string,
  mediaType: string
}

I have defined a variable with a union type using allCountdownItems: movieProps[] | gameReleaseDate[]我已经使用allCountdownItems: movieProps[] | gameReleaseDate[]定义了一个具有联合类型的变量allCountdownItems: movieProps[] | gameReleaseDate[] allCountdownItems: movieProps[] | gameReleaseDate[] that contain both types of objects. allCountdownItems: movieProps[] | gameReleaseDate[]包含这两种类型的对象。

I am using .map() to render info for each item.我正在使用.map()来呈现每个项目的信息。 I am doing this by using:我这样做是通过使用:

return (
  <div>
    {(this.state.allCountdownItems as Array<movieProps | gameReleaseDate>).map(item => {
      return (
        <h2>{item.mediaType === "movie" ? item.title : item.game.name}</h2>
      )
    })}
  </div>
)

This give me the following error:这给了我以下错误:

Property 'title' does not exist on type 'movieProps |类型 'movieProps | 上不存在属性 'title' gameReleaseDate'.游戏发布日期'。 Property 'title' does not exist on type 'gameReleaseDate'.ts(2339)类型“gameReleaseDate”.ts(2339) 上不存在属性“title”

How can I solve this without declaring item as an any type?如何在不将item声明为any类型的情况下解决此问题?

You are trying to discriminate between the union with item.mediaType === "movie"您试图区分与item.mediaType === "movie"

In order for that to work you need to declare literal members on the union member ie为了使其工作,您需要在联合成员上声明文字成员,即

interface movieProps {
  adult: boolean,
  backdrop_path: string,
  genre_ids: number[],
  id: number,
  original_language: string,
  original_title: string,
  overview: string,
  popularity: number,
  poster_path: string,
  release_date: string,
  title: string,
  video: boolean,
  vote_average: number,
  vote_count: number,
  mediaType:'movie' // HERE
  documentID: string
}

interface gameReleaseDate {
  id: number,
  category: number,
  created_at: number,
  date: number,
  game: game,
  human: string,
  m: number,
  platform: number,
  region: number,
  updated_at: number,
  y: number,
  documentID: string,
  mediaType:'game' // HERE
}

More更多的

Discriminated unions TypeScript 可区分联合 TypeScript

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM