Можно ли опустить типы в TypeScript на основе условия? - PullRequest
0 голосов
/ 30 марта 2020

Я даже не знаю, возможно ли это, потому что я действительно не знаком с условной типизацией и наиболее продвинутыми аспектами TypeScript, но я пытаюсь смоделировать что-то вроде следующего (опуская неинтересные биты):

interface RouteComponentProps {
  history: any;
  match: any;
}

interface LoginProps extends RouteComponentProps {
  greeting: string;
}

export const Login = (props: LoginProps) => '';

export const Root = () => {
  return <Route path="/login" component={Login} withProps={{ greeting: 'hello' }} />
};

Я хочу, чтобы TypeScript жаловался, если я забуду передать withProps с пропущенными правыми пропусками (в данном случае { greeting }), предполагая, что history и match будут всегда передаваться вниз.

То, что я до сих пор получил, это:

interface RouteProps<T extends Record<string, any>> {
  path: string;
  withProps?: Omit<T, keyof RouteComponentProps>;
  Component: (props: T) => JSX.Element;
}

declare const Route: <T = any>(props: RouteProps<T>) => JSX.Element;

Жалуется, если я передал неправильный withProps (например, пропустил greeting) but it doesn't if I omit withProps` полностью.

Можно ли с условными типами и типами утилит определить, необходимы ли какие-либо дополнительные реквизиты и, следовательно, сделать обязательным withProps или, если дополнительные реквизиты не требуются, сделать его необязательным?

TypeScript игровая площадка с тем, что я получил: https://www.typescriptlang.org/play/?jsx=1#code / JYOwLgpgTgZghgYwgAgEoHsCukDC6C2ADuiBOAApTqEDOyA3gFDLIAWwNY6UAngFzI4IHgG5myfHDAJWAoaMYBfRitCRYigBAHBHBBRBR4RKR4 Ph8NxQilZZBd3MRYAd2AwVj1aAH4BAHl8GOMvAGsIHnQYNCxcAmJSCipaHwjkPCISMjABAApCcpoBIwBKZABefwApAGUADQA6AFEAGwh8erFlRit7CbgoFAcQTgKdAWMe7x4fZtaBbUh4wyMfLt7kQdHJ6dmVRjVoeCRkABl0N1Bz0wsZBsWyKtVKYH + TBYblWEDA7gEYRAbjmKkWCGWq2Q60231 + ICaLX0Ajxf1a136w3GUxm4DEjAA9AzkAAJOCEQg8ZBBWJeCAAN2gPFi7gBhHskCsyA43NWNBo9UY5mIUDA2JImww6DV3WQjQpARYqzAmCgIGQBlOKB5rG6ACIGRMfqA7dVinVwN16KSQIpkNFYucvfRkDCIHCEcgAOSsCATJ1R5CKP0MnxKelM5BGdh0KzoCA0EBRtUOIjLUDS-IBuKtaV0OAAIwV4CVZhVJY1aq1YAATHt9T1-FDkMbTebLYVrcF7Y7nSBXTUSvUvT6U2nFBnmdmZQ4oKsEGAJlzS4RyxtK-6YjX9HXZQX6t4paw4HRQPy4BNgFL3xNMAXW + 26obF26DagAzP2BrDqOZoWla3LTg6Tr4gu7rgiuc5 + tWQb0CGYYRsiPYCDGcYJkma7pkAA

...