Я даже не знаю, возможно ли это, потому что я действительно не знаком с условной типизацией и наиболее продвинутыми аспектами 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