创建基本体的联合类型和基本体数组时的流类型错误

时间:2019-03-14 16:08:23

标签: javascript reactjs flowtype

我正在尝试创建一种Transform类型以接受该属性的可能值,但是在尝试将string原语与这些原语数组组合时遇到错误。

export type Transform = {
  matrix?: [number],
  rotate?: number | string,
  scale?: number | [number],
  skew?: string | [string],
  translate?: [number | string],
};

该错误抱怨skewtranslate属性与number中的matrix不兼容,但是如果我删除了matrix,该错误继续下一行。

这是错误:

Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ packages/utils/types.js:12:20

string [1] is incompatible with number [2].

 [2]  9│   matrix?: [number],
     10│   rotate?: number | string,
     11│   scale?: number | [number],
 [1] 12│   skew?: string | [string],
     13│   translate?: [number | string],
     14│ };
     15│


Error ┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈ packages/utils/types.js:13:25

string [1] is incompatible with number [2].

 [2]  9│   matrix?: [number],
     10│   rotate?: number | string,
     11│   scale?: number | [number],
     12│   skew?: string | [string],
 [1] 13│   translate?: [number | string],
     14│ };
     15│



Found 2 errors

该项目托管在GitHub中,您可以在https://github.com/davegomez/silky/tree/master/packages/group

中使用此类型检查文件

更新

我开始怀疑问题可能是在使用参数中的代码之前,我正在处理验证的方式,但是我不确定为了帮助Flow了解什么,我必须如何重构它正在发生。

这是使用Type的代码:

// @flow
import type { Transform } from './types';

// Will take the transform object and return the correct transform attribute
// value based on the passed object properties
export default function getTransform(transform: Transform = {}) {
  var { matrix, rotate, scale, skew, translate } = transform;
  var join = x => x.join(', ');
  var attrs = [];

  matrix && attrs.push(`matrix(${join(matrix)})`);
  rotate && attrs.push(`rotate(${rotate})`);
  scale &&
    attrs.push(`scale(${typeof scale === 'number' ? scale : join(scale)})`);
  skew && attrs.push(`skew(${typeof skew === 'string' ? skew : join(skew)})`); // This might be the problem
  translate && attrs.push(`translate(${join(translate)})`); // This might be the problem

  return attrs.length ? attrs.join(' ') : null;
}

我只是无法发现自己​​正在犯的错误,将不胜感激。

1 个答案:

答案 0 :(得分:0)

好吧,我发现了问题所在,是Flow无法在join函数中推断参数的类型。

将参数类型声明为[any]将解决此问题:

...
var join = (xs: [any]): string => xs.join(', ');
...