Я заметил, что происходит много повторений, когда я расширяю свою кодовую базу, когда дело доходит до создания интерфейсов 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
}






Вам просто нужно сделать базовый интерфейс универсальным, приняв параметр типа, который расширяет 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> можно использовать псевдонимы, как указано выше, или вы можете использовать их напрямую.