TypeScript检查本质上就是:在技术上可以帮你检查的地方帮你检查,不能检查的地方要求你明确声明。
说明:假定我们在 tsconfig.js 中设置了 strict: false

使用props.children

想要在 .ts文件中新增如下代码是会告警的:
image.png

因此我们需要给props进行类型声明,可以提供 React 提供的函数组件类型:

  1. // type React.FC<P = {}> = React.FunctionComponent<P>
  2. const AppBody: React.FC = (props) => {
  3. return (
  4. <div className="app-body">
  5. {props.children}
  6. </div>
  7. );
  8. }

React.FC代表函数组件的类型,我们没有给FC定义范型但直接拿到了children,原因是:

Notice that children isn’t defined in Props. Instead, it is already defined in the FC type.

详细的定义可以参考官方的声明文件:

  1. type FC<P = {}> = FunctionComponent<P>;
  2. interface FunctionComponent<P = {}> {
  3. (props: PropsWithChildren<P>, context?: any): ReactElement<any, any> | null;
  4. propTypes?: WeakValidationMap<P>;
  5. contextTypes?: ValidationMap<any>;
  6. defaultProps?: Partial<P>;
  7. displayName?: string;
  8. }
  9. type PropsWithChildren<P> = P & { children?: ReactNode };

更多在Reac组件中获取children的做法可以参考这篇文章

混合自定义参数使用

假设父组件中想传入一个title和一个fn:

  1. <AppBody title={'passed in title'} fn={() => { return "fn exectued" }}>
  2. body content
  3. </AppBody>

有多种方式可以定义被引用的组件:

  1. // 方式1
  2. interface Props {
  3. title: string,
  4. fn?: () => string
  5. }
  6. const AppBody: React.FC | Props = (props) => {
  7. return (
  8. <div className="app-body">
  9. {props.children}
  10. </div>
  11. );
  12. }
  13. // 方式2
  14. interface Props {
  15. children: React.ReactNode,
  16. title: string,
  17. fn?: () => string
  18. }
  19. const AppBody = (props: Props) => {
  20. return (
  21. <div className="app-body">
  22. {props.children}
  23. </div>
  24. );
  25. }
  26. export default AppBody;