我希望编写一个类型安全的工具函数,用于比较 Typescript 4.0 中给定两个对象的属性。我的初始尝试如下:
export function propsAreEqual<O extends object, T extends O, S extends O>(first: T, second: S, props: (keyof O)[]) {
return props.every(prop => first[prop] === second[prop])
}
然而,使用这种方法我遇到了编译错误TS2367,错误信息如下:
This condition will always return 'false' since the types 'T[keyof O]' and 'S[keyof O]' have no overlap.
对我来说,该错误似乎不符合直觉。如果 T
和 S
都扩展了类型为 O
的对象,那么它们两个不都必须包含类型为 O
的所有键吗?如果有人能澄清我在这里缺少什么,并且指出我尝试实现的更稳妥的方法,我将不胜感激。
O
只是表示扩展object
" 哦,好的,这样更清楚了。我再一次对TS如何推断类型有错误的假设... - arslancharyev31