Typescript 将最小值和差值的交点指定给最小值和最小值的交点

Typescript 将最小值和差值的交点指定给最小值和最小值的交点,typescript,Typescript,我从中借用了术语subtrahand、minuten和difference 我有两种类型,Foo和Bar,它们应该是具有键和值的简单对象,这些键和值可能有重叠键,也可能没有重叠键。我想要一个类型OnlyFoo,它是subtrahandFoo和minutedBar之间的差异。这很简单: type OnlyFoo = Omit<Foo, keyof Bar> TypeScript为该代码的fooBar赋值提供以下错误: // Type 'Pick<Foo, Exclude<

我从中借用了术语subtrahand、minuten和difference

我有两种类型,
Foo
Bar
,它们应该是具有键和值的简单对象,这些键和值可能有重叠键,也可能没有重叠键。我想要一个类型
OnlyFoo
,它是subtrahand
Foo
和minuted
Bar
之间的差异。这很简单:

type OnlyFoo = Omit<Foo, keyof Bar>
TypeScript为该代码的
fooBar
赋值提供以下错误:

// Type 'Pick<Foo, Exclude<keyof Foo, keyof Bar>> & Bar' is not assignable to type 'Foo & Bar'.
//   Type 'Pick<Foo, Exclude<keyof Foo, keyof Bar>> & Bar' is not assignable to type 'Foo'.
//     'Pick<Foo, Exclude<keyof Foo, keyof Bar>> & Bar' is assignable to the constraint of type 'Foo', but 'Foo' could be instantiated with a different subtype of constraint '{}'.ts(2322)
//类型“Pick&Bar”不能分配给类型“Foo&Bar”。
//类型“Pick&Bar”不可分配给类型“Foo”。
//“Pick&Bar”可分配给“Foo”类型的约束,但“Foo”可以用约束“{}”的不同子类型实例化。ts(2322)
以下是中的相同示例


错误消息表明“
Foo
可以用约束的子类型
{}
实例化,这将使赋值非法。我似乎想不出这样的类型。我可以对
Foo
做进一步的限制来实现这一点吗?

不幸的是,已知的省略、排除的TS限制不能很好地用于泛型。看一看下面的回答:

我们没有任何机制可以解决这个问题。问题是排除是一个高阶操作;当它的输入是通用的,我们没有任何方法来预测它的另一面

您只能执行类型断言:

{ ...fooOnly as Foo, ...bar }

你可以从typescript playground链接一些东西吗?@Renaud我已经更新了这个问题,在typescript playground中包含了一个到相同示例的链接。这似乎是一个专门与泛型有关的问题:是的,我相信这是因为编译器知道
Foo
的确切类型,所以
Foo
不可能是“使用不同的子类型实例化…”似乎与这些类型脚本问题有关:,和。另请参见此
{…fooonloyas Foo,…bar}
是类型转换,使用类型保护的断言在运行时会更安全。@Renaud您能举一个例子说明在这种情况下使用类型保护的断言会是什么样子吗?这里不需要类型保护。下面是一个例子@MaciejSikora my bad,我不知道正确的术语,
{ ...fooOnly as Foo, ...bar }