как переобразавать один интерфейс(или обект) в другой интерфейс
есть интерфейс
interface IName {
'name-a': string;
'name-b': string;
'name-c': string;
}
или обект
const name = {
'name-a': 'a',
'name-b': 'b',
'name-c': 'c',
};
нужно получить на его основе такой интерфейс
interface IRoot {
name: string;
}
нужно автаматически все это получить
типо IRoot<typeof name> либо IRoot<IName> и на выход получить то что на верху
суть в том что IName будет разростатся и он на основе css modules, то есть типы автаматически выводятся из того что в стилях.
руками писать 'name' не вариант
Ответы (1 шт):
Автор решения: Alexey Ten
→ Ссылка
Подозреваю что вам нужно это https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html
interface IRoot {
[k: `name-${string}`]: string;
}
// ok
q['name-ok'] = 'ok';
// error
q['name-error'] = false;
q['error'] = 'string';
А может проще определить generic-тип:
type IRoot<prefix extends string> = Record<`${prefix}-${string}`, string>;
let q: IRoot<'name'> = {};
// ok
q['name-ok'] = 'ok';
// errors
q['name-error'] = false;
q['error'] = 'string';
