使用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
类型具有嵌套属性怎么办?
解决方案:这可以通过使用Exact Object Types选中此https://flow.org/try...
来解决。答案 0 :(得分:1)
基于在facebook / flow信息库上创建的问题#6616,wchargin 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;
}