mro*_*avy 4 javascript types typescript definitelytyped reactjs
我正在尝试使用 TypeScript 为导航库定义自定义类型,但我还没有专注于创建一个函数,该navigate函数将屏幕的名称作为第一个参数,将屏幕的属性作为第二个参数,同时仍然是类型安全的。
我试图:
keyof Stack) 作为第一个参数navigate<LoginStack>('HomeScreen')应该永远不会工作,只有屏幕LoginStack应该是可能的)keyof Stack作为第二个参数我目前的做法:
ScreenDefinitions.ts:
export interface LoginStackScreens {
LoginScreen: BaseProps & { isHeadless?: boolean };
ForgotPasswordScreen: BaseProps & { email: string };
}
export interface HomeStackScreens {
HomeScreen: BaseProps & { isHeadless?: boolean };
SavedScreen: BaseProps;
ChatsListScreen: BaseProps;
MyProfileScreen: BaseProps;
PostDetailsScreen: BaseProps & {
post: Post;
};
// ... some more
}
Run Code Online (Sandbox Code Playgroud)
Navigation.ts:
type ValueOf<T> = T[keyof T];
function navigate<Stack extends HomeStackScreens | LoginStackScreens>(screenName: keyof Stack, props: ValueOf<Stack>): void {
// Navigation logic
}
navigate<HomeStackScreens>('HomeScreen', {});
Run Code Online (Sandbox Code Playgroud)
虽然我实现了第 1.点和第 2. 点,但第二个参数(参数)的输入并不安全,因为它们包含堆栈中的所有值HomeStackScreens:
而我只想BaseProps & { isHeadless?: boolean }在这种情况下(参见HomeStackScreens定义)
尝试这个!
function navigate<Stack extends {}>(
screenName: keyof Stack,
props: Stack[typeof screenName]
) {
// Implementation
}
Run Code Online (Sandbox Code Playgroud)
例子,
type SomeStack = {
someScreen: {
test: string
}
}
navigate<SomeStack>('someScreen', {
test: 5 // Fails - should be a string!
})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10427 次 |
| 最近记录: |