Почему литералы должны быть жестко запрограммированы для работы в TypeScript?

Я создаю поисковую систему для телешоу и фильмов, и она работает, но единственная проблема, с которой я сейчас сталкиваюсь, заключается в том, что 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;
}

Это зависит от сервера. Будет ли ваш сервер возвращать обе категории. если да, то какова конечная точка

Tushar Shahi 05.05.2024 15:42

API — это tmdb, поэтому он должен быть одним из них. api.themoviedb.org/3/movie/157336, пример

SA_ 05.05.2024 16:01
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
1
3
87
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Литерал — это более конкретный подтип собирательного типа. Это означает, что "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.

Другие вопросы по теме