以下代码会导致错误,因为根据TypeScript,类型Pick<Test<T>, Exclude<keyof T, "someKey">>
无法分配给T
。当我想到这种类型时,应该将其分配给T
,是否有任何办法让TypeScript与我达成一致?还是这只是突破了TypeScript中通用类型的界限,因为不会动态键入的变体将正确编译。
type Test<T = {}> = T & {
someKey: string
};
function extract<T>(props: Test<T>): T {
const {someKey, ...rest} = props;
return rest;
}
以及完整的TS错误消息
Type 'Pick<Test<T>, Exclude<keyof T, "someKey">>' is not assignable to type 'T'.ts(2322)
答案 0 :(得分:1)
在这种情况下,Typescript实际上是正确的。
假设您有某种类型的A
:
type A = {
someKey: string;
someOtherKey: string;
}
然后,您的extract<A>
将删除密钥someKey
并返回某种类型的
{
someOtherKey: string;
}
这将不能分配给A
。
答案 1 :(得分:0)
尝试通过这种方式对函数建模:
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>;
用法:
extract({ someKey: 'foo', foo: 1, bar: 2 }); // $ExpectType { foo: number, bar: number }