流类型和多态性

乔纳森·图兹曼

下面的组件采用一fieldsField对象。Field班是由扩展SelectboxField(和其它领域,但是这是一个在到目前为止的代码)。该组件确定字段的类型并呈现该字段的特定组件。特定组件,比如说将SelectboxFieldView特定类型的字段 ( SelectboxField)作为道具

// @flow
import React, { Component } from "react";
import { Text, View } from "react-native";
import Field from "../models/fields/Field";
import SelectboxFieldView from "../components/SelectboxFieldView";
import SelectboxField from "../models/fields/SelectboxField";

type Props = { fields: Field[] };
type State = {};

class FieldsRenderer extends Component<Props, State> {
  render() {
    const MockFields = [
      this.props.fields.find(f => f.type === "selectbox") || new Field()
    ]; 

    // const fields = this.props.fields
    const fields = MockFields
    return (
      <View>
        {fields.map((field, i: number) => {
          switch (field.constructor) {
            case SelectboxField:
              const selField: SelectboxField = field;  // ERROR HERE
              return <SelectboxFieldView key={i} field={selField} />;
            default:
              return <Text key={i}>A Field</Text>;
          }
        })}
      </View>
    );
  }
}
export default FieldsRenderer;

我在我已经指出的行上收到一个流错误,在单词上field,说:

Cannot assign field to selField because Field is incompatible with SelectField`

无论是否有 . 的显式类型定义,都会出现此错误selField

我也尝试过类型转换表达式:

 switch (field.constructor) {
            case SelectboxField:
              (field: SelectboxField);
              return <SelectboxFieldView key={i} field={field} />;

但它说“无法将字段转换为 SelectboxField 因为字段与 SelectboxField 不兼容

这似乎不对:

// @flow

class Field {
  title: string;
  type: string;

  static fromApiFormInfo(formInfo: Object): Field {
    const field = new Field();
    field.title = formInfo.title;
    field.type = formInfo.type;
    return field;
  }
}

export default Field;
// @flow
import Field from "./Field";

class SelectboxField extends Field {
  placeholder: string;
  options: string[];

  static fromApiFormInfo(formInfo: Object): SelectboxField {
    const base = new SelectboxField();
    const baseField = super.fromApiFormInfo(formInfo);
    const field: SelectboxField = Object.assign(base, { ...baseField });
    field.options = formInfo.options;
    field.placeholder = formInfo.placeholder_text;
    return field;
  }
}

export default SelectboxField;

有没有办法管理这个?

罗根迷思
switch (field.constructor) {
  case SelectboxField:

不是 Flow 可以将其作为类型细化处理以便理解它fieldSelectboxField. 你会想做

if (field instanceof SelectboxField) {
  return <SelectboxFieldView key={i} field={field} />;
} else {
  return <Text key={i}>A Field</Text>;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章