Допустим есть такой интерфейс(
на самом деле он конечно гораздо сложней):
interface Some {
value: string | string[];
}
Мне нужно получить константу полностью соответствующую этому типу, но конкретизированную по значению. Т.е. можно ли как-то заявить для ts, что структура будет именно такой и меняться не будет?
Если просто указать тип, то работать не будет, т.к. ts считает что структура объекта может измениться как угодно в пределах типа, что логично:
const foo: Some = {
value: ['a', 'b'] // здесь всегда будет массив
};
foo.value.map(() => {}); // Property 'map' does not exist on type 'string | string[]'
То что примерно мне нужно, я могу получить сделав функцию-обёртку:
function SomeType<T extends Some>(value: T): T {
return value
}
const bar = SomeType({
value: ['a', 'b'] // здесь всегда будет массив
});
bar.value.map(() => {}); // ок
Но хотелось бы как-то правильно это делать.
...upd:
Что именно мне нужно:
a) при объявлении объекта он должен быть проверен на соответствие типу Some(чтоб ide мне сразу подсветила если я где-то ошибся и предложила автокомплит).
б) при последующей работе с объявленным объектом я не хочу уточнять в ручную каждый подтип каждого свойства и подсвойства возможного в типе Some, ts должен понять их из объявления.
с) объявленный объект должен всё ещё оставаться для ts вариантом типа Some, чтобы его можно было спокойно передавать в методы и функции ожидающие Some на вход.
д) объект должен оставаться мутабельным(в рамках конкретизированного типа, само собой).