как переобразавать один интерфейс(или обект) в другой интерфейс

Рейтинг: 0Ответов: 1Опубликовано: 21.03.2023

есть интерфейс

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Принят

Подозреваю что вам нужно это 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';

playground

А может проще определить 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';

playground