Абстрактный класс AbstractPanelComponent имеет объект config, который хранит некоторую информацию о конфигурации. Когда я расширяю абстрактный класс, я хочу иметь возможность расширить тип config, чтобы добавить пользовательские конфигурации, необходимые для реализации.
// Default Config Type
export type DefaultPanelConfig = {
name: string
}
// Type I want to use for extending (to add additional info)
export type CustomConfig = {
additionalConfig: string;
}
@Component({template: ''})
export abstract class AbstractPanelComponent {
config: Partial<DefaultPanelConfig> = {};
}
@Component(...)
export class APanelComponent extends AbstractPanelComponent {
// TODO: Expand the allowed Config somehow...
override config: Partial<CustomConfig & DefaultPanelConfig> = {}
}
Использование override config служит своей цели, но не кажется хорошим стилем. Есть ли лучший способ реализовать такую функцию конфигурации, или это уже хороший способ? Например, я думал об использовании дженериков и чего-то вроде <T extends Partial<DefaultPanelConfig>>, но не мог понять, как мне это использовать. Я с нетерпением жду ваших отзывов!





Вы можете использовать дженерики, чтобы сделать его более элегантным. Хитрость в том, что вы можете напрямую использовать Partial<T & DefaultPanelConfig> как свой DefaultConfiguration. Таким образом, вы можете легко расширить его с помощью универсального типа и установить универсальный тип по умолчанию, чтобы вам не приходилось его расширять.
Ниже вы можете увидеть пример реализации:
// Default Config Type
type DefaultPanelConfig = {
name: string
}
// Panel Configuration (Generic, so that it can easily be extended)
// Intersect the default panel configuration with the generic to easily extend it
type PanelConfiguration<T = {}> = Partial<T & DefaultPanelConfig>
// Declare AbstractPanelComponent and set the generic to empty object by default.
abstract class AbstractPanelComponent<T = {}> {
config: PanelConfiguration<T> = {};
}
/* From here on: Two Test Cases */
// Testing "Default" PanelConfiguration
class APanelComponent extends AbstractPanelComponent {
// No generic type: Use DefaultPanelConfig and nothing more
override config: PanelConfiguration = {
name: "Custom Configuraton", // Valid
/* additionalConfig: "More Configuration", */ // Invalid (as supposed to)
/* invalid: "invalid" */ // Invalid (as supposed to)
}
}
// Declare Custom Config for testing
type CustomConfig = {
additionalConfig: string;
}
// Testing Extending "Default" Panel Configuration with Custom Configuration
class BPanelComponent extends AbstractPanelComponent<CustomConfig> {
// Expand the Config by simply adding the Generic Type
override config: PanelConfiguration<CustomConfig> = {
name: "Custom Configuraton", // Valid
additionalConfig: "More Configuration", // Valid
/* invalid: "invalid" */ // Invalid (as supposed to)
}
}
Спасибо, работает как положено! Если у кого-то еще есть предложения по улучшению, не стесняйтесь, дайте мне знать! :)