Javascript 引用类型本身,类型脚本

Javascript 引用类型本身,类型脚本,javascript,typescript,react-native,types,react-navigation,Javascript,Typescript,React Native,Types,React Navigation,我试图根据输入的值(屏幕名称)将类型(屏幕参数类型)传递给字段 这是导航道具 export interface IEditProfileStackNavigatorProps<RouteName extends keyof EditProfileRoutes> { navigation: StackNavigationProp<EditProfileRoutes, RouteName>; route: RouteProp<EditProfileRoutes,

我试图根据输入的值(屏幕名称)将类型(屏幕参数类型)传递给字段

这是导航道具

export interface IEditProfileStackNavigatorProps<RouteName extends keyof EditProfileRoutes> {
  navigation: StackNavigationProp<EditProfileRoutes, RouteName>;
  route: RouteProp<EditProfileRoutes, RouteName>;
}
因此,如果插入到
screenToNavigateTo
中的屏幕是
username
,那么参数类型将是
{token:string}
,其余的则是
未定义的

我的方法是

export type EditProfileRoutes = {
  Options: undefined;
  Name: undefined;
  Username: { token: string };
  Bio: undefined;
  Location: undefined;
  VerifyUser: {
    screenToNavigateTo: keyof Omit<EditProfileRoutes, 'VerifyUser'> | keyof ManageAccountRoutes;
    params?:EditProfileRoutes['VerifyUser']['screenToNavigateTo'];
  };
};
导出类型EditProfileRoutes={
选项:未定义;
名称:未定义;
用户名:{token:string};
生物:未定义;
位置:未定义;
验证用户:{
screenToNavigateTo:keyof Omit | keyof ManageAccountRoutes;
参数?:EditProfileRoutes['VerifyUser']['screenToNavigateTo'];
};
};

但这似乎不起作用

您希望
VerifyUser
的两个字段相互匹配,因此我们需要的是所有有效配对的并集

这将获取对象
路由
并将其映射到具有相同键的新对象,但这些值是具有属性
screenToNavigateTo
params
的对象
screenToNavigateTo
Routes
中的键,
params
是值

type RouteParams<Routes> = {
  [K in keyof Routes]: {
    screenToNavigateTo: K,
    params: Routes[K];
  }
}
我们从
RouteParams
获得的已解析的并集如下所示:

{
    screenToNavigateTo: "Options";
    params: undefined;
} | {
    screenToNavigateTo: "Name";
    params: undefined;
} | {
    screenToNavigateTo: "Username";
    params: {
        token: string;
    };
} | { ...
使用此类型,我们现在可以将
EditProfileRoutes
定义为:

export type EditProfileRoutes = {
  Options: undefined;
  Name: undefined;
  Username: { token: string };
  Bio: undefined;
  Location: undefined;
  VerifyUser: RouteParams<Omit<EditProfileRoutes, 'VerifyUser'>> | RouteParams<ManageAccountRoutes>
};
导出类型EditProfileRoutes={
选项:未定义;
名称:未定义;
用户名:{token:string};
生物:未定义;
位置:未定义;
验证用户:路由图|路由图
};

您希望
VerifyUser
的两个字段相互匹配,因此我们需要的是所有有效配对的并集

这将获取对象
路由
并将其映射到具有相同键的新对象,但这些值是具有属性
screenToNavigateTo
params
的对象
screenToNavigateTo
Routes
中的键,
params
是值

type RouteParams<Routes> = {
  [K in keyof Routes]: {
    screenToNavigateTo: K,
    params: Routes[K];
  }
}
我们从
RouteParams
获得的已解析的并集如下所示:

{
    screenToNavigateTo: "Options";
    params: undefined;
} | {
    screenToNavigateTo: "Name";
    params: undefined;
} | {
    screenToNavigateTo: "Username";
    params: {
        token: string;
    };
} | { ...
使用此类型,我们现在可以将
EditProfileRoutes
定义为:

export type EditProfileRoutes = {
  Options: undefined;
  Name: undefined;
  Username: { token: string };
  Bio: undefined;
  Location: undefined;
  VerifyUser: RouteParams<Omit<EditProfileRoutes, 'VerifyUser'>> | RouteParams<ManageAccountRoutes>
};
导出类型EditProfileRoutes={
选项:未定义;
名称:未定义;
用户名:{token:string};
生物:未定义;
位置:未定义;
验证用户:路由图|路由图
};