如何用$ Diff验证可选字段?

时间:2019-08-01 08:01:57

标签: flowtype

我希望我的类型验证传递给React组件的“默认道具”,但是HashMap<String, String> params = new HashMap<String, String>() {{ put("globalDates", "{\"startMs\":1473672973818,\"endMs\":1481448973817,\"period\":90}"); put("limitTo","6" ); ,... }} (为此目的而设计)没有这样做。如何获得这种行为?

 resp = RestAssured.given()
                    .headers(headers)
                    .queryParameters(params)
                    .post(apiURL).andReturn();

1 个答案:

答案 0 :(得分:2)

$Diff<A, B>返回默认情况下将接受其他属性的对象类型。这意味着AB上的任何属性都可以位于任何类型的$Diff<A, B>类型的对象上。就您而言,RequiredProps等效于{ name: string }。因此,对象{ name: '', age: <whatever> }: RequiredProps对于<whatever>的任何值都是完全有效的。

您似乎真正想要的是一个对象类型,该对象类型需要RequiredProps 的所有属性,并且需要DefaultProps中的任何属性都与该类型定义匹配。这可以通过类型

来实现
type RequiredAndDefaultProps = { ...$Exact<RequiredProps>, ...DefaultProps };

可以验证的

type Props = { name: string, age: number };
type DefaultProps = { age: number };
type RequiredProps = $Diff<Props, DefaultProps>;
type RequiredAndDefaultProps = { ...$Exact<RequiredProps>, ...DefaultProps };

({ name: 'foo' }: RequiredAndDefaultProps);
({ name: 'foo', age: 42 }: RequiredAndDefaultProps);
({ name: 'foo', age: '42' }: RequiredAndDefaultProps); // Error: age should be number
({ age: 42 }: RequiredAndDefaultProps); // Error: missing name
({ name: 'foo', bar: 'bar' }: RequiredAndDefaultProps);

Try Flow

相关问题