如何在Typescript中定义拒绝对象键的泛型函数?

如何在Typescript中定义拒绝对象键的泛型函数?,typescript,types,typescript-typings,Typescript,Types,Typescript Typings,我试图定义一个实用函数来清理特定键的对象 /** * Strip all the __typenames from the payload. */ interface WithTypename { __typename?: string; }; type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>; const omitTypename = <T extends With

我试图定义一个实用函数来清理特定键的对象

/**
 * Strip all the __typenames from the payload.
 */
interface WithTypename {
  __typename?: string;
};

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

const omitTypename = <T extends WithTypename>({ __typename, ...rest }: T): Omit<T, '__typename'> => ({ ...rest });
/**
*从有效负载中删除所有类型名。
*/
与typename的接口{
__typename?:字符串;
};
类型省略=拾取;
const-ommittypename=({uuuu-typename,…rest}:T):Omit=>({…rest});

但是编译器抱怨函数参数
{uuuu typename,…rest}
。Rest类型只能从对象类型创建。

这是Typescript中已知的扩展限制,有多个问题,这是最近的一个问题

一种可能的解决方法是使用
对象。分配
,然后删除额外的属性

/**
 * Strip all the __typenames from the payload.
 */
interface WithTypename {
__typename?: string;
};

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

const omitTypename = <T extends WithTypename>(o: T): Omit<T, '__typename'> => {
    let r = Object.assign({}, o);
    delete r.__typename;
    return r;
}
/**
*从有效负载中删除所有类型名。
*/
与typename的接口{
__typename?:字符串;
};
类型省略=拾取;
常量ommittypename=(o:T):Omit=>{
设r=Object.assign({},o);
删除r.。uu类型名称;
返回r;
}