具有部分定义flowjs的对象类型

时间:2017-02-13 02:33:03

标签: javascript types flowtype

说我有一个功能:

user.comparepassword()

未能通过以下方式进行检查:

const example = (item : ?{+type?: ?string}) : {+result: ?string} => {
  const state = {}
  state.result = item.result
  return state
}

为什么不进行这次类型检查?我没有使用确切的对象类型表示法 12: state.result = item.result ^^^^^^^ property `result`. Property not found in 12: state.result = item.result ^^^^^^ object type 来定义类型,所以它不应该允许其他键吗?那么确切的对象符号是如何工作的呢?我如何定义这样的部分对象类型?这甚至可能吗?

1 个答案:

答案 0 :(得分:1)

听起来您正在尝试使用参数item可以具有任何属性的类型进行编码。这听起来像一张地图,Flow编码为:

{ [key: KeyType]: ValueType };

您的示例可以像这样更新:

const example = (item : ?{[key: string]: string}) : {+result: ?string} => {
  const state = {}
  if(item)
  {
     state.result = item.result;
  }
  return state
}

注意,您必须对item进行空检查,否则它不会进行类型检查,因为您在函数签名中将其声明为可为空。

如果item存在某些必需属性,则可以使用交集类型添加该约束。我将为此创建一个新类型,因此更容易阅读签名:

type Item = {[key: string]: string} & {type: string}

const example = (item : ?Item) : {+result: ?string} => {
  const state = {}
  if(item)
  {
     state.result = item.result;
  }
  return state
}


example({type: 'blah', x: '2'}); // OK
example({'blah', x: '2'}); // Error: type is missing