簡體   English   中英

參考類型在其內部,TypeScript

[英]Reference Type Within itself, 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;
  };
};

我希望參數根據插入導航 function 中的屏幕名稱接收屏幕的參數類型。

navigation.navigate('VerifyUser', {
  screenToNavigateTo: 'Username',
  params: { some: 'value' } }
)}

因此,如果在screenToNavigateTo中插入的屏幕是username ,則參數類型將為{ token: string }並且對於 rest 它將是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的兩個字段相互匹配,所以我們想要的是所有有效配對的並集。

通用映射類型采用 object Routes並將其映射到具有相同鍵的新 object,但值是具有屬性screenToNavigateToparams的對象。 screenToNavigateToRoutes的鍵, 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>
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM