Чтобы компилятор ограничивал тип props
в зависимости от типа screen
, вам нужно дать ему отображение. Самый простой способ сделать это в вашем случае - создать фиктивный интерфейс, поскольку типы props
уже являются клавишными:
interface ScreenPropsMapping {
[LANDING]: LandingProps,
[REGISTER]: RegisterProps,
[LOGIN]: LoginProps
}
Поскольку LANDING
et c равны const
строковые литералы, мы можем использовать их как вычисляемые ключи в интерфейсах.
Затем вы даете navigate()
a generi c подпись, подобную этой:
function navigate<K extends keyof ScreenPropsMapping>(
screen: K, props: ScreenPropsMapping[K]
) {
}
Здесь K
должен быть одним из ключей интерфейса отображения, а props
- конкретным типом свойства для этого ключа:
navigate(LANDING, { foo: "" }); // okay
navigate(LANDING, { bar: 1 }); // error
Что касается вашего примечания, если вы действительно хотите, чтобы тип был объединением всех типов экспортируемых значений в модуле, вы можете сделать что-то вроде этого:
import * as File1 from 'file1'
type File1Types = typeof File1[keyof typeof File1];
// type File1Types = "landing.Landing" | "landing.Register" | "landing.Login"
Хорошо, надеюсь что помогает; удачи!
Детская площадка ссылка на код