繁体   English   中英

如何创建一个 function 类型,该类型将泛型作为参数并具有取决于参数属性的返回类型

[英]How to create a function type which takes generic as parameter and has a return type dependent on the properties of the parameter

很抱歉标题冗长而令人困惑,但我不确定如何以一种有助于更短的方式描述必要的内容。

基本上我想做的是创建一个类型,例如func<T>(filterProps:T): SomeReturnType其中SomeReturnType是作为 T 的子类型创建的新类型,但只有提供的filterProps参数中存在的字段。

例如

interface User {
  name: String
  age: Number
  jobTitle: String
}

const user = find<User>({ name: true, age: true }) {
    // return Type should be inferred to { name: string, age: number }
}

user.name // no error
user.jobTitle // should display error

您可以执行以下操作。 您需要声明一个类型,该类型将省略您不需要的道具,并且该类型应该是您的 function 的返回类型

interface User {
  name: String
  age: Number
  jobTitle: String
}
type UserWithoutjobTitle = Omit<User, "jobTitle">;


const user = find<User>({ name: true, age: true }):UserWithoutjobTitle =>{
    // return Type should be inferred to { name: string, age: number }
}

这是更新的解决方案。

function find<T ,K>(): Omit<T, Exclude<keyof T, keyof K>>
 { 
     return {"name":'test' } as unknown as Omit<T, Exclude<keyof T, keyof K>>
};
const user = find<User,{ name: true, age: true }>();
console.log(user.name);

像这样的东西?

function find<T, K extends keyof T>(thing: T, filterProps: K[]) {
  return thing as Pick<T, K>;
}

const ourUser: User = { name: 'John McClane', age: 44, jobTitle: 'Cop' };
const filteredUser = find(ourUser, ['name', 'age']); // Pick<User, "name" | "age">
filteredUser.name; // String
filteredUser.age; // Number
filteredUser.jobTitle; //error

也许您的版本会从 function 主体中“找到”该thing ,而不是将其作为参数传递。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM