Я создаю поисковую систему для телешоу и фильмов, и она работает, но единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что 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;
}
API — это tmdb, поэтому он должен быть одним из них. api.themoviedb.org/3/movie/157336, пример
Пожалуйста, отредактируйте свой код, чтобы он стал минимально воспроизводимым примером , который мы можем скопировать и вставить в наши собственные IDE, чтобы увидеть то, что видите вы. На данный момент это отрывок из более крупной базы кода, поэтому нам не хватает множества объявлений, которые потребуются для начала работы. В идеале вместо того, чтобы просто показывать нам часть вашего кода, вы должны создать отдельный минимально воспроизводимый пример без каких-либо зависимостей от сторонних или частных материалов и просто с той проблемой, которую вы видите. Предположительно это как-то связано с MediaDetailsResponse
. Пожалуйста, воссоздайте или смоделируйте для нас этот тип, используя только встроенные типы TS, чтобы это был минимально воспроизводимый пример.
Литерал — это более конкретный подтип собирательного типа. Это означает, что "Hello World"
является string
, а string
не является "Hello World"
в системе типов.
Если вы объявляете переменную, используя, например, var
или let
:
let mediaType = "movie";
И передайте эту переменную mediaType
в getMediaDetails()
, Typescript сделает вывод, что это string
, и, следовательно, это не сработает. [1]
Но использование const
для объявления переменной сообщит TypeScript, что этот объект никогда не изменится, поэтому TypeScript сможет правильно установить тип "Hello World"
, а не string
.
Но использование const
так же хорошо, как и жесткое кодирование, не так ли? Лучшее решение — объявить фактический type
, например:
type MediaType = "movie" | "tv";
Теперь в getMediaDetails()
используйте актуальный type
:
/* •••Rest of code•••*/
media_type?: MediaType;
/* •••Rest of code•••*/
И правильное объявление переменной будет:
let mediaType: MediaType = "movie";
[1] Remember that "Hello World"
is a string
, but a string
is not "Hello World"
in the type system.
Это зависит от сервера. Будет ли ваш сервер возвращать обе категории. если да, то какова конечная точка