@Boris007

В каких случаях используют as keyof typeof?

Зачем в TS придумали выражения as и as keyof typeof?
Их используют для запросов по апи, когда в теории понятен тип данных, но на практике тайпскрипт не может этого проверить в реальности?

У меня был пример с кодом
import { blogPosts } from "data/data-blog-posts" (данные взяты статично для тестирования без апи)

Мои типы
type Posts = {
    [key: string]: Post
}

type Post = {
    header: string;
    page: Element[]
}

type Element = {
    tag: string;
    image_src?: string;
    image_alt?: string;
    text?: string;
}


Мое первое решение
const posts: Posts = blogPosts
const data: Post = posts[params.name]

Предложенное второе решение (но тут как будто бы и не важно типизируем мы эти данные или нет)
const data = blogPosts[params.name as keyof typeof blogPosts]

Есть еще и третье решение, но здесь, как мне показалось, мы не используем тайп скрипт для удобства, а усложняем себе жизнь
const isPosts = (posts: unknown): posts is Posts => !!posts 
  && typeof posts === 'object' 
if (!isPosts(blogPosts)) throw new Error('wrong blogPosts');
const data = blogPosts[props.name]


Посмотрев все решения, мне зашел только первый (из-за его простоты и понятности + это реально удобно)
Поделитесь пожалуйста своим мнением по этим трем вариантам, возможно я просто плохо знаю ТС и поэтому так рассуждаю
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
@daniel_wesson
Как правило странно в массиве объектов использовать строковые ключи, а не обычные индексы. Лучше сделать
type Posts = Post[]
keyof typeof вернет список всех возможных ключей объекта (в вашем случе просто string). Поэтому если вы их не определяете где-то, то в данном случае as keyof typeof точно не нужен.

Например в объекте { id: 1, title: 'Test', description: 'Описание' }, keyof typeof вернет тип "id" | "title" | "description"
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы