我正在尝试在打字稿中编写一个函数,该函数验证对象是否具有某些属性,但我一开始就陷入困境,键 xyz 是否存在?我尝试使用以下代码来做到这一点:
import _ from 'lodash/fp';
type Pred = (o: Object) => boolean
const required_keys: Pred[] = _.map(_.has,['id','field1'])
const validate: Pred = _.overEvery(required_keys)
我预计
required_keys
的类型将是Pred[]
,但打字稿LSP告诉我它是boolean[]
。我预计在我们将一个参数应用于_.has
之后,我仍然必须应用另一个正在测试的对象。
是我错了还是LSP,LSP和我如何才能达成协议?
通过显式指定参数,可以推断出正确的类型:
const required_keys: Pred[] = _.map(p => _.has(p), ['id', 'field1']);
const validate: Pred = _.overEvery(required_keys);
我可以在类型定义中看到这两个函数的许多重载。编译器似乎无法确定哪些适用。
按照我的理解,使用
lodash/fp
的规范方式是 _.map(_.has)(['id', 'field1'])
,但这并不能解决您最初的问题,也不能使用显式 lambda 参数,因为它的类型将被推断为 unknown
。