下面的组件采用一fields
组Field
对象。该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 可以将其作为类型细化处理以便理解它field
是SelectboxField
. 你会想做
if (field instanceof SelectboxField) {
return <SelectboxFieldView key={i} field={field} />;
} else {
return <Text key={i}>A Field</Text>;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句