繁体   English   中英

从泛型的返回类型推断参数

[英]Infer parameters from return type of generic

我正在创建一个 function,其中第一个参数是“服务”数组,第二个参数推断这些服务的返回类型。 例如:

const serviceOne = createService([], () => Promise.resolve({} as Service1));
const serviceTwo = createService([], () => Promise.resolve({} as Service2));

const serviceThree = createService(
  [serviceOne, serviceTwo],
  (one, two) => Promise.resolve({}), // one should be inferred as Service1, two should be inferred as Service2
);

如何修改我的 function 签名来实现这个推断? 目前,我将它们按any类型输入

function createService<T extends Service<any>[], U>(deps: T, factory: (...args: any[]) => Promise<U>) {
  return {} as Service<U>;
}

type Service<U> = {
  instance: U
};

操场

您可能首先需要将约束更改为T以获得 typescript 以推断元组类型而不是数组类型。 为此,我们只需要将带有空元组的联合添加到约束 ( [] | )。 这将在右侧 state 中设置 typescript 以推断元组

然后我们可以使用映射类型到 map,从包含Service<any>的元组到包含服务类型的元组:

const serviceThree = createService(
  [serviceOne, serviceTwo],
  (one, two) => Promise.resolve({} as Service3), // one is Service1, two is Service2
);

type GetServiceType<T extends Service<any>[]> = unknown [] & {
  [P in keyof T]: T[P] extends Service<infer R> ? R: never
}
function createService<T extends [] | Service<any>[], U>(deps: T, factory: (...args: any[] & GetServiceType<T>) => Promise<U>) {
  return {} as Service<U>;
}

游乐场链接

暂无
暂无

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

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