Я не слишком уверен в правильности терминов для использования TypeScript. Но я чувствую, что повторяюсь и хотел бы лучше шаблонизировать свой интерфейс, чтобы не запутаться.
У меня есть type
, который в основном представляет собой список потенциальных строк. Затем я использовал эти строки в ключах для своего interface
.
Это мой файл:
import { IErrorResponse } from '~/interfaces'
export type PRODUCT_ACTION_KEYS =
| 'creatingProducts'
| 'fetchingCategories'
| 'fetchingProduct'
| 'fetchingProducts'
export interface IProductsReducer {
categories: any[]
error: {
creatingProduct?: IErrorResponse
fetchingCategories?: IErrorResponse
fetchingProduct?: IErrorResponse
fetchingProducts?: IErrorResponse
}
is: {
creatingProduct: boolean
fetchingCategories: boolean
fetchingProduct: boolean
fetchingProducts: boolean
}
products: any[]
selectedProduct?: any
}
Я хотел бы получить что-то вроде этого:
import { IErrorResponse } from '~/interfaces'
export type PRODUCT_ACTION_KEYS =
| 'creatingProducts'
| 'fetchingCategories'
| 'fetchingProduct'
| 'fetchingProducts'
export interface IProductsReducer {
categories: any[]
error: {
[PRODUCT_ACTION_KEYS]?: IErrorResponse
}
is: {
[PRODUCT_ACTION_KEYS]: boolean
}
products: any[]
selectedProduct?: any
}
Будет ли что-то подобное реализовано в TypeScript?
Спасибо!
Да, для этого нужны отображаемые типы
export interface IProductsReducer {
categories: any[]
error: {
[key in PRODUCT_ACTION_KEYS]?: IErrorResponse
}
is: {
[key in PRODUCT_ACTION_KEYS]: boolean
}
products: any[]
selectedProduct?: any
}
Другой способ получить тот же тип — использовать комбинацию встроенных типов Partial и Record:
error: Partial<Record<PRODUCT_ACTION_KEYS, IErrorResponse>>