@Boris007

Как типизировать вложенного объекта в объекте в одну строку?

type Posts = {
    [key: string]: Post
}

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

type Page = {
    tag?: string;
    image_src?: string;
    image_alt?: string;
}


По отдельности это работает
const posts: Posts = blogPosts
const data: Post = posts[props.name]


Как затипизировать это выражение, чтобы получить этот же результат в одну строку?
const result = blogPosts[props.name]
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type
No index signature with a parameter of type 'string' was found on type
  • Вопрос задан
  • 164 просмотра
Решения вопроса 2
Aetae
@Aetae Куратор тега TypeScript
Тлен
Тупо скастовать можно так:
const result = (blogPosts as Posts)[props.name]

Но это не правильно, по хорошему ты должен изначально убедиться, что blogPosts - нужного типа:
// тайпргард: тут проверка что posts действительно Posts; 
const isPosts = (posts: unknown): posts is Posts => !!posts 
  && typeof posts === 'object' 
//&& ... ;

if (!isPosts(blogPosts)) throw new Error('wrong blogPosts');

const result = blogPosts[props.name];
Ответ написан
@HungryGrizzzly
Сумасшедший кросс
Тут вопрос к типизации props.name. TS считает его просто стрингом, следовательно, поля может не быть в blogPosts, а должен считать keyof typeof blogPosts. Тогда все будет хорошо, но надо видеть весь код, чтоб подсказать, как поправить. Самый же "ламерский" способ:
const result = blogPosts[props.name as keyof typeof blogPosts]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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