【发布时间】:2018-07-28 07:33:33
【问题描述】:
考虑以下使用流道具的示例。
import * as React from 'react';
type FooProps = {|
foo: number,
bar?: string
|};
class Foo extends React.Component<FooProps> {}
我们有 React 组件类 Foo,它接受一个精确的 props 对象。我们希望强制执行准确性,以免用户无意中在他们的道具上打错字(例如,baz 当他们打算使用 bar 时)。
这绝对可以正常工作,并且会按预期发生错误。
但是,如果我们想从其他地方向这个组件传播 props 怎么办?例如:
const f = (props: FooProps) => <Foo {...props} />;
Flow 会在props 上给我们一个关于准确性的错误:
10: const f = (props: FooProps) => <Foo {...props} />;
^ Cannot create `Foo` element because inexact props [1] is incompatible with exact `FooProps` [2].
References:
10: const f = (props: FooProps) => <Foo {...props} />;
^ [1]
8: class Foo extends React.Component<FooProps> {}
^ [2]
不考虑“当你要求精确性时,你不应该将 props 传播到这样的组件”的论点,如何实现传播?
我确实找到了一种方法来做到这一点,但它使用了一个未记录的实用程序类型$Shape<T> (code)。目前尚不清楚这是否有任何后果或副作用,但它似乎可以正常工作:
class Foo extends React.Component<$Shape<FooProps>> {}
这是一个link to try out what I've got using $Shape<T>,其中包含我预计会出错(而不是)的项目:
【问题讨论】:
-
$Shape 变体不只是使组件采用不精确的道具,而您的功能采用精确的吗?所以你还没有解决让组件采用精确道具的问题。我的理解是创建接受精确道具的组件是不明智的。未引用的道具不是问题。错误输入 prop 名称意味着缺少预期的 prop 值(在需要时),因此会产生错误。
-
@DaveMeehan 这正是我所说的 $Shape 具有意想不到的后果的意思。考虑到各种用例,输入错误的可选道具可能会出现问题。这种错误可能很小,例如缺少视觉提示,也可能很大,例如收入损失。
标签: javascript reactjs flowtype