Создайте шаблон интерфейса TypeScript

Я заметил, что происходит много повторений, когда я расширяю свою кодовую базу, когда дело доходит до создания интерфейсов TypeScript в моем проекте.

Видеть это:

interface IErrorResponse {
  code: number
  message: string
}

// Feature 1
type FEATURE_1_KEYS =
  | 'fetchingActivities'
  | 'fetchingActivityTypes'

interface IFeature1ErrorAction
  extends IErrorResponse {
  key: FEATURE_1_KEYS
}

// Feature 2
type FEATURE_2_KEYS =
  | 'fetchingSomethingElse'
  | 'updatingSomething'

interface IFeature2ErrorAction
  extends IErrorResponse {
  key: FEATURE_2_KEYS
}

Итак, когда я использую последние ErrorActions (интерфейсы), здесь я бы использовал IFeature1ErrorAction и IFeature2ErrorAction. Мой проект имеет много особенностей.

Есть ли способ создать IErrorAction, построенный из моего IErrorResponse, где я просто передаю эти FEATURE_KEYS для ключа?

Тогда я мог бы использовать его вот так IErrorAction<FEATURE_1_KEYS>.

Это сэкономило бы много повторений в моем процессе разработки, и я уверен, что это можно сделать, я просто не уверен, как это сделать.

По сути, результат этого интерфейса для IErrorAction<FEATURE_1_KEYS> будет отображать следующий интерфейс:

interface IErrorAction = { // How do I get that `TEMPLATED_KEYS` in there?
  code: number,
  key: TEMPLATED_KEYS,
  message: string
}
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
1 027
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам просто нужно сделать базовый интерфейс универсальным, приняв параметр типа, который расширяет string:

interface IErrorResponse<TFeatures extends string> {
  code: number
  message: string
  key: TFeatures
}

// Feature 1
type FEATURE_1_KEYS =
  | 'fetchingActivities'
  | 'fetchingActivityTypes'

type IFeature1ErrorAction = IErrorResponse<FEATURE_1_KEYS> // 

// Feature 2
type FEATURE_2_KEYS =
  | 'fetchingSomethingElse'
  | 'updatingSomething'

type IFeature2ErrorAction = IErrorResponse<FEATURE_2_KEYS>

IErrorResponse<FEATURE_1_KEYS> и IErrorResponse<FEATURE_2_KEYS> можно использовать псевдонимы, как указано выше, или вы можете использовать их напрямую.

Другие вопросы по теме