流默认值类型检查

时间:2018-07-19 12:11:58

标签: javascript flowtype

使用Object.assign分配默认值时,流程类型检查出现问题。这是一个示例:

type ConfigIn = {
  someValue?: number,
};

type Config = ConfigIn & {
  someValue: number,
};

function test(config: ConfigIn): number {
  // here Flow will report an error:
  // Cannot assign `Object.assign(...)` to `myConfig` because 
  // undefined [1] is incompatible with number [2] in property `someValue`.:
  const myConfig: Config = Object.assign({}, {
    someValue: 1000,
  }, config);

  return otherFunction(myConfig.someValue);
}

function otherFunction(input: number): number {
  return 123;
}

以下是在线示例的链接:https://flow.org/try...

如果我在各处都使用ConfigIn类型而不是Config,则会得到:

Cannot call `otherFunction` with `myConfig.someValue` bound to `input` 
because undefined [1] is incompatible with number [2].

以下是链接:https://flow.org/try...

不建议在某处使用类型any的推荐方法是什么?

奖励

如果我的ConfigIn类型具有嵌套属性怎么办?

示例:https://flow.org/try...

解决方案:这可以通过使用Exact Object Types选中此https://flow.org/try...

来解决。

1 个答案:

答案 0 :(得分:1)

基于在facebook / flow信息库上创建的问题#6616wchargin suggested避免使用交叉运算符(Type1 && Type2),因为它们往往更容易中断。

相反,可以使用类型传播运算符:

type ConfigIn = {
  someValue?: number,
};

type Config = {
  ...ConfigIn, // spread instead intersection
  someValue: number,
};

function test(config: ConfigIn): number {
  const myConfig: Config = Object.assign({}, {
    someValue: 1000,
  }, config);

  return otherFunction(myConfig.someValue);
}

function otherFunction(input: number): number {
  return 123;
}

尝试:https://flow.org/try/..