【问题标题】:Flow type for optional property on react component with attribute spread具有属性传播的反应组件上的可选属性的流类型
【发布时间】:2018-09-20 09:50:15
【问题描述】:

尝试使用流在反应组件上键入属性很有趣,其中属性可以是枚举或对象。

似乎当我使用{...spread} 作为可以具有多种类型(联合)的可选属性之后的属性时,流程总是指出它们不兼容。

这个想法是允许属性是来自枚举的字符串值,或者值的类型也必须是该枚举的对象。

如果将{...spread} 放在属性之前,它确实可以工作,但这不是所需的功能。

例如(Try Flow):

/* @flow */
import React from 'react';

type _TextAlign = 'left' | 'center' | 'right';

type TextAlign = _TextAlign | { [key: string]: _TextAlign };

type Props = { textAlign?: TextAlign }

const CStr = (props: Props) => <div textAlign="center" {...props}  />;

给予

8: type Props = {  textAlign?: TextAlign }
                               ^ object type [1] is incompatible with string [2].

【问题讨论】:

  • 我想很难理解你为什么要设置textAlign = { 'a': 'right', 'b': 'center' }。看起来是个错误。

标签: javascript reactjs flowtype


【解决方案1】:

查看Props 类型的一些可能值:

  • { 'textAlign': 'left' }
  • { 'textAlign': { 'a': 'right', 'b': 'center' }

所以当你到达这部分时:

<div textAlign="center" {...props}  />;

您收到错误,因为 { 'a': 'right', 'b': 'center' } 不是字符串,也不是 textAlign 的有效值。

您可以将所有可能的值构建为具有键和值的类型:

type TextAlign = { textAlign?: _TextAlign } | { [key: string]: _TextAlign };
type Props = { ...TextAlign };

但这实际上是一样的:

type TextAlign = { [key: string]: _TextAlign };
type Props = { ...TextAlign };

如果您随后也允许任何其他密钥,则指定可选的 'textAlign' 密钥没有任何好处。

【讨论】:

  • 如果我必须“将所有可能的值构建到具有键和值的类型中” - 似乎意味着我无法获得我想要的结果,即拥有一个接受一个或一个对象的类型枚举是谁的值?
  • @skh 如果props 是一个包含键和字符串值的映射,那么您可以使用扩展运算符,就像在您的源代码中一样。如果值是字符串和映射的混合,那么你不能。
  • 您是否希望{ 'textAlign' : { 'a': 'right', 'b': 'left' } }Props 的有效值?
  • 理想情况下,是的,这将是有效的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-23
相关资源
最近更新 更多