为什么必须对这个参数进行硬编码才能在 TypeScript 中工作?

问题描述 投票:0回答:1

我正在为电视节目和电影制作一个搜索引擎,它正在工作,但我现在遇到的唯一问题是

media_type
必须硬编码为
"tv"
"movie"

如果我将其设置为

"tv"
,那么它会显示电视节目的详细信息,但我看不到电影详细信息,如果我将其设置为
"movie"
,它只会显示电影的详细信息,但不会显示电视节目的详细信息。我需要它动态地为两者工作。

URL 的格式将类似于以下任一格式:

localhost:3000/tv/1434
localhost:3000/movie/65215
  getMediaDetails: async ({
    mediaId,
    media_type
  }: {
    mediaId: number | null;
    media_type?: "movie" | "tv";
  }) => {
    if (!mediaId) {
      throw new Error("Media ID must be provided.");
    }
    const endpoint = `${media_type}/${mediaId}`;
    const response = await httpClient
      .get(endpoint, {
        searchParams: {
          append_to_response: "credits",
          language: "en-US"
        }
      })
      .json<MediaDetailsResponse>();
    response.name = response.title || response.name; // Unified 'name' attribute
    return response;
  },
typescript
1个回答
1
投票

文字是集体类型的更具体的子类型。这意味着

"Hello World"
string
,但
string
在类型系统
中不是 
"Hello World"

如果您使用

var
let
声明变量,例如:

let mediaType = "movie";

并将此变量

mediaType
传递给
getMediaDetails()
,Typescript 会推断它是一个
string
,因此这将不起作用。 [1]

但是使用

const
声明变量会通知 TypeScript 该对象永远不会改变,因此 TypeScript 可以正确地将类型设置为
"Hello World"
not
string


但是使用

const
和硬编码一样好,不是吗?更好的解决方案是声明一个实际的
type
例如:

type MediaType = "movie" | "tv";

现在在

getMediaDetails()
中,使用实际的
type

/* •••Rest of code•••*/
media_type?: MediaType;
/* •••Rest of code•••*/

正确的变量声明是:

let mediaType: MediaType = "movie";

[1] 请记住,

"Hello World"
string
,但
string
在类型系统
中不是 
"Hello World"

© www.soinside.com 2019 - 2024. All rights reserved.