Typescript 基于输入对象字段的函数的通用返回类型

Typescript 基于输入对象字段的函数的通用返回类型,typescript,Typescript,我想要一个基于输入对象的返回类型。我们在函数中实现了一个mongoose样式的字段选择器,我想实现依赖于输入对象字段的返回类型Being 以下代码示例应说明此问题: interface IFields { _id: number; name: string; value1: string; value2: string; value3: string; value4: string; value5: string; value6: string; } expor

我想要一个基于输入对象的返回类型。我们在函数中实现了一个mongoose样式的字段选择器,我想实现依赖于输入对象字段的返回类型Being

以下代码示例应说明此问题:

interface IFields {
  _id: number;
  name: string;
  value1: string;
  value2: string;
  value3: string;
  value4: string;
  value5: string;
  value6: string;
}

export interface IFieldsSelector<T> {
    fields: {
        [key in keyof T]?: boolean;
    };
}

interface IResult extends IFields{ }

const select = (payload: IFieldsSelector<IFields>): IResult => {
  return {} as IResult;
};

const result = select({
  fields: {
    _id: true,
    value1: true,
  }
});

result.value1; // ok
result._id; // ok

result.name // error

我们可以将输入键定义为泛型类型参数typescript将推断出它,然后从iFelds中将它们定义为:


我们可以将输入键定义为泛型类型参数typescript将推断出它,然后从iFelds中将它们定义为:


这似乎起到了作用,但如果我将name设置为false,则不会出现错误。const result=select{fields:{u id:true,name:false,};result.name//no errorYes,它当前选择所有提供的键,无论值是什么。我将添加一个考虑到价值的版本,这似乎是在起作用,但是如果我将name设置为false,那么我不会得到错误。const result=select{fields:{u id:true,name:false,};result.name//no errorYes,它当前选择所有提供的键,无论值是什么。稍后我将添加一个考虑价值的版本
export interface IFieldsSelector<T extends PropertyKey> {
  fields: {
    [key in T]?: boolean;
  };
}

interface IResult extends IFields { }

const select = <T extends keyof IFields>(payload: IFieldsSelector<T>): Pick<IFields, T> => ({} as IResult);

const result = select({
  fields: {
    _id: true,
    value1: true,
  }
});

result.value1; // ok
result._id; // ok

result.name // now error