javascript - 引用类型本身,TypeScript
问题描述
我正在尝试根据输入的值(屏幕名称)将类型(屏幕参数类型)传递给字段。
这是导航道具。
export interface IEditProfileStackNavigatorProps<RouteName extends keyof EditProfileRoutes> {
navigation: StackNavigationProp<EditProfileRoutes, RouteName>;
route: RouteProp<EditProfileRoutes, RouteName>;
}
和路线
export type EditProfileRoutes = {
Options: undefined;
Name: undefined;
Username: { token: string };
Bio: undefined;
Location: undefined;
VerifyUser: {
screenToNavigateTo: keyof Omit<EditProfileRoutes, 'VerifyUser'> | keyof ManageAccountRoutes;
params: any;
};
};
我希望 params 根据导航功能中插入的屏幕名称接收屏幕的参数类型。
navigation.navigate('VerifyUser', {
screenToNavigateTo: 'Username',
params: { some: 'value' } }
)}
因此,如果插入的屏幕screenToNavigateTo
是username
参数类型{ token: string }
,其余的将是undefined
.
我的方法是做类似的事情
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'];
};
};
但这似乎不起作用
解决方案
您希望 的两个字段VerifyUser
相互匹配,所以我们想要的是所有有效配对的联合。
这种通用 映射类型接受一个对象Routes
并将其映射到具有相同键的新对象,但值是具有属性screenToNavigateTo
和的对象params
。 screenToNavigateTo
是来自的关键Routes
,params
是价值。
type RouteParams<Routes> = {
[K in keyof Routes]: {
screenToNavigateTo: K,
params: Routes[K];
}
}
然后我们[keyof Routes]
在最后添加(一个索引访问类型)来抛弃键,只得到所有元素的联合。
type RouteParams<Routes> = {
[K in keyof Routes]: {
screenToNavigateTo: K,
params: Routes[K];
}
}[keyof Routes]
我们从中得到的已解决联合RouteParams<EditProfileRoutes>
如下所示:
{
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>
};
推荐阅读
- javascript - 从 JavaScript 到 PHP 存储时间值很热?
- android - Firebase Auth Android SDK 在电子邮件验证期间使用旧的无效 api 密钥
- react-native - Pedometer.watchStepCount 没有发出任何信号
- c++ - 在 C++ 中引用多维数组
- python - “更新程序”设计模式,而不是“生成器”
- java - 为什么按钮显示错误的颜色?
- android - 我有一个用 flutter 编写的简单代码。现在我想格式化它。我使用 VSC 并安装了 Prettier
- slick.js - 当前索引幻灯片 slickslider loop false
- sql-server - 如何根据某些列值从 SQL Server 表中查找重复条目?
- sql - 如何将 SQL Server 几何数据插入到 postgis 几何数据类型列