我正在尝试创建一种Transform
类型以接受该属性的可能值,但是在尝试将string
原语与这些原语数组组合时遇到错误。
export type Transform = {
matrix?: [number],
rotate?: number | string,
scale?: number | [number],
skew?: string | [string],
translate?: [number | string],
};
该错误抱怨skew
和translate
属性与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;
}
我只是无法发现自己正在犯的错误,将不胜感激。
答案 0 :(得分:0)
好吧,我发现了问题所在,是Flow无法在join
函数中推断参数的类型。
将参数类型声明为[any]
将解决此问题:
...
var join = (xs: [any]): string => xs.join(', ');
...