代码之家  ›  专栏  ›  技术社区  ›  yellow-saint

蚂蚁的@Form.create<Props>()decorator导致不明确的TypeScript错误

  •  1
  • yellow-saint  · 技术社区  · 8 年前

    How to use antd.Form.create in typescript? )但却没有找到摆脱当前困境的出路。

    使用 @Form.create<IProps>() 作为一个装饰师,或者 Form.create<IProps>()(Login) 在导出时,两者都会导致这个奇怪的错误。

    下面是我看到的Typescript错误:

        [ts]
        Unable to resolve signature of class decorator when called as an expression.
        Type 'ComponentClass<RcBaseFormProps & Pick<IProps, "isLoggedIn" | "goTo" | "login">>' is not assignable to type 'typeof Login'.
            Type 'Component<RcBaseFormProps & Pick<IProps, "isLoggedIn" | "goTo" | "login">, ComponentState, any>' is not assignable to type 'Login'.
            Property 'checkLoggedIn' is missing in type 'Component<RcBaseFormProps & Pick<IProps, "isLoggedIn" | "goTo" | "login">, ComponentState, any>'.
    
        (alias) class Form
        import Form
    

    组成部分

    import * as React from 'react'
    import { Input, Form, Button, Icon } from 'antd'
    import { FormComponentProps } from 'antd/es/form'
    import { Link } from 'react-router-dom'
    
    interface IProps extends FormComponentProps {
        goTo: (path: string, state?: any) => void
        isLoggedIn: boolean | undefined
        login: (username: string, password: string) => Promise<void>
    }
    
    @Form.create<IProps>()
    class Login extends React.Component<IProps> {
    constructor(props: IProps) {
        super(props)
    }
    
    public componentDidMount() {
        this.checkLoggedIn()
    }
    
    public componentDidUpdate() {
        this.checkLoggedIn()
    }
    
    private checkLoggedIn = () => {
        if (this.props.isLoggedIn) {
        this.props.goTo('/')
        }
    }
    
    private handleSubmit = async e => {
        e.preventDefault()
        this.props.form &&
        this.props.form.validateFields(async (err, { username, password }) => {
            if (!err) {
            await this.props.login(username, password)
            this.props.goTo('/')
            }
        })
    }
    
    public render() {
        const getFieldDecorator = this.props.form ? this.props.form.getFieldDecorator : undefined
        return getFieldDecorator ? (
          <div>
            <Form onSubmit={this.handleSubmit} className="login-form">
                <Form.Item>
                {getFieldDecorator('username', {
                    rules: [{ required: true, message: 'Email required' }]
                })(
                    <Input
                    prefix={<Icon type="user" style={{ color: 'rgba(0,0,0,.25)' }} />}
                    placeholder="User email"
                    size="large"
                    />
                )}
                </Form.Item>
                <Form.Item>
                {getFieldDecorator('password', {
                    rules: [{ required: true, message: 'Password required' }]
                })(
                    <Input
                    prefix={<Icon type="lock" style={{ color: 'rgba(0,0,0,.25)' }} />}
                    type="password"
                    placeholder="Password"
                    size="large"
                    />
                )}
                </Form.Item>
                <Form.Item>
                <Link to="request-password-reset">Forgot my password</Link>
                <Button type="primary" htmlType="submit" className="login-form-button w-100">
                    Log in
                </Button>
                </Form.Item>
            </Form>
          </div>
        ) : null
    }
    }
    
    export default Login
    

    软件包版本

    • react "16.5.2"
    • react-dom "16.5.2"
    • antd "3.9.2"
    • typescript "3.0.3"
    1 回复  |  直到 7 年前
        1
  •  2
  •   Matt McCutchen    7 年前

    decorator不能在TypeScript中工作:请参阅 this answer . 使用 Form.create<IProps>()(Login)