说我有一个功能:
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
来定义类型,所以它不应该允许其他键吗?那么确切的对象符号是如何工作的呢?我如何定义这样的部分对象类型?这甚至可能吗?
答案 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