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