Я работаю над угловым проектом и использую интерфейс для определения конфигурации модуля.Интерфейс предназначен для сопоставления имен с объектами и довольно прост:
export interface NamedRoutes {
[routeName: string]: NamedRoute;
}
Когда я создаю экземпляр этого интерфейса, intellisense не может разрешить элементы экземпляра, когда я его использую.Например:
const routes: NamedRoutes {
someRoute: {...}
};
const someRoute = routes. // no intellisense support here
Насколько я знаю, проблема в том, что когда компилятор пытается отследить элементы, он видит, что индексы являются строками и, следовательно, все может быть разрешено, поэтому он не способенпредложение реально существующих членов.
Когда я опускаю ввод константы, intellisense может предложить правильные члены.Насколько я знаю, это потому, что имена индексов интерпретируются как символы, а не строки.Недостатком является то, что пользователи моего API получат поддержку компилятора только для ошибок, когда они передают объекты моему методу конфигурации, который в случае нашего проекта может находиться в совершенно ином месте, чем создание объекта.На мой взгляд, это был бы очень плохой UX для API.
Я пытался использовать различные расширенные типы, такие как Record<string, NamedRoute>
и <T extends string = string>
(для индекса).
Я надеюсьЯ ясно дал понять, в чем моя проблема и чего я пытаюсь достичь.Есть ли более эффективный способ сделать это?
PS: использование типа вместо интерфейса было бы вариантом для нашего проекта.