如何在打字稿中使用antd.Form.create?

Ken*_*nir 28 forms typescript antd

我有一个由Form.create()创建的登录表单,但我不能从父组件传递任何道具到这个表单,编译器总是会通知错误

error TS2339: Property 'loading' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes<Compone
nt<{}, ComponentState>> & Readonly<{ childr...'.
Run Code Online (Sandbox Code Playgroud)

LoginForm.tsx

import * as React from 'react';
import { Form } from 'antd';
import { WrappedFormUtils } from 'antd/lib/form/Form';

interface Props {
    form: WrappedFormUtils;
    loading: boolean;
    username?: string;
}

class LoginForm extends React.Component<Props, {}> {
    render() {
        const { loading } = this.props;
        return (<div>form {loading ? 'true' : 'false'}</div>);
     }
}

export default Form.create()(LoginForm);
Run Code Online (Sandbox Code Playgroud)

LoginPage.tsx

import LoginForm from './components/loginForm';

const loginPage: React.SFC<Props> = (props) => {
     return (
         <div>
              <LoginForm loading={true}/>
                         ^ error here!
         </div>
     );
 };
Run Code Online (Sandbox Code Playgroud)

我的antd版本是2.11.2


最后我找到了解决方案

class LoginForm extends React.Component<Props & {form:     WrappedFormUtils}, State> {
  render() {
    const { loading } = this.props;
    return (<div>form {loading ? 'true' : 'false'}</div>);
  }
}

export default Form.create<Props>()(LoginForm);
Run Code Online (Sandbox Code Playgroud)

Ama*_*tle 44

  1. 导入FormComponentProps

    import {FormComponentProps} from 'antd/lib/form/Form';
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后有你的组件

    interface YourProps {
        test: string;
    }        
    
    class YourComponent extends React.Component<YourProps & FormComponentProps> {
        constructor(props: YourProps & FormComponentProps) {
            super(props);
            ...
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后使用Form.create()导出类

    export default Form.create<YourProps>()(YourComponent);
    
    Run Code Online (Sandbox Code Playgroud)

    Form.create上的泛型参数将结果转换为带有YourProps的React ComponentClass - 没有FormComponentProps,因为这些是通过Form.create包装器组件注入的.

  • 我用FormComponentProps扩展道具:```接口YourProps扩展FormComponentProps {...}`,它也对我有用。 (2认同)

小智 9

我从antd文档中得到了更好的方法

import { Form } from 'antd';
import { FormComponentProps } from 'antd/lib/form';

interface UserFormProps extends FormComponentProps {
  age: number;
  name: string;
}

class UserForm extends React.Component<UserFormProps, any> {
  // ...
}

const App = Form.create<UserFormProps>({
  // ...
})(UserForm);
Run Code Online (Sandbox Code Playgroud)