Typescript 提取对象接口的通用rest属性

Typescript 提取对象接口的通用rest属性,typescript,Typescript,以下代码导致错误,因为根据TypeScript,类型Pick不可分配给T。当我对这种类型进行推理时,应该将其分配给T,是否还有其他方法让TypeScript同意我的意见?或者,这仅仅是推到了TypeScript中泛型类型的边界,因为非动态类型的变体将正确编译 型式试验=T&{ someKey:字符串 }; 功能提取(道具:测试):T{ const{someKey,…rest}=props; 返回休息; } 以及完整的TS错误消息 Type 'Pick<Test<T>, Exc

以下代码导致错误,因为根据TypeScript,类型
Pick
不可分配给
T
。当我对这种类型进行推理时,应该将其分配给
T
,是否还有其他方法让TypeScript同意我的意见?或者,这仅仅是推到了TypeScript中泛型类型的边界,因为非动态类型的变体将正确编译

型式试验=T&{
someKey:字符串
};
功能提取(道具:测试):T{
const{someKey,…rest}=props;
返回休息;
}
以及完整的TS错误消息

Type 'Pick<Test<T>, Exclude<keyof T, "someKey">>' is not assignable to type 'T'.ts(2322)
类型“Pick”不能分配给类型“T”。ts(2322)

在这种情况下,Typescript实际上是正确的

假设您有某种类型的
A

type A = {
    someKey: string;
    someOtherKey: string;
}
然后,您的
extract
将删除键
someKey
,并返回该类型的内容

{
    someOtherKey: string;
}

通过分配给
A

将无法使用以下方法对函数进行建模:

interface Some {
  someKey: string;
}

function extract<T extends Some>(props: T): Subtract<T, Some> {
  const { someKey, ...rest } = props;

  return rest;
}

type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
type Subtract<T, U> = Omit<T, keyof U & keyof T>;

请参阅。

如果
T
{someKey:string}
,并且
rest
是隐式
{}
,并且您的函数断言返回类型为
T
,那么结构显然不匹配。但即使省略对象文本(
{}
)作为
T
的隐式类型,这些类型不会检查?
{}&{someKey:string}
始终是
{someKey:string}
。省略<代码> {} /代码>对您的交叉类型没有影响。考虑替换<代码> test = t& {键:字符串;}<代码> > <代码> test = t& {键:字符串}。结果类型仍然是
{someKey:string;}
。希望更有经验的人能给我们一些启示。在我的例子中,
T
{someKey:string}
相交,我假设它对应于一种类型,在心智模型中看起来像这样:
{…T,someKey:string}
。也许我对交叉点类型的行为做出了一些错误的假设?@Matthisk这大致正确,但是如果
T
已经有
someKey:string
,那么
{…T,someKey:string}
就是
{…T}
,或者
T
,因此,一旦你去掉
someKey
你就不再有
T
。这是有意义的,所以当我将
exclude
的返回类型调整为
Pick
时,它将编译。
extract({ someKey: 'foo', foo: 1, bar: 2 }); // $ExpectType { foo: number, bar: number }