提取对象接口的通用其余属性

时间:2019-03-14 19:17:10

标签: typescript

以下代码会导致错误,因为根据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)

2 个答案:

答案 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 }

请参见Result