我确信这是预期的行为,但对我来说它看起来违反直觉。鉴于以下代码片段,为什么
item
被推断为 { a: number }
而不是 { b: number }
?我期待着一种压倒一切的Options & { activities: Array<{ b: number }>}
。
我发现用
options
替换 Omit<Options, 'activities'> & { activities: Array<{ b: number }> }
参数类型可以解决问题,但我想了解为什么 TS 以这种方式工作以获得 Omit<>
的需要。
这是代码,您可以复制粘贴:
type Activity = { a: number };
type Options = { activities: Activity[] }
const fun = (options: Options & { activities: Array<{ b: number }> }) => {
return options.activities.map(item => item.b)
}
我期待覆盖
activities
属性,因此它会得到 { b: number }[]
类型。
&
运算符不是递归的,并且不会覆盖任何内容。
TypeScript 的目标是让代码变得更好而不是更差。
https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#intersection-types