在TypeScript中将泛型与映射的条件类型一起使用

时间:2018-07-30 05:39:52

标签: typescript

是否可以将具有泛型的泛型用于映射方法类型?

例如:您可以创建一个映射类型,在其中向每个方法添加类型number的第一个参数吗?

伪代码(不起作用)

interface Method<TS extends any[], R> { 
  (...args: TS): R;
}
interface NumberedMethod<TS extends any[], R> { 
  (n: number, ...args: TS): R;
}


type Numbered<T> = {
  // ERROR! Can't use generics here??
  <TS extends any[], R>[K in keyof T]: T[K] extends NumberedMethod<TS, R>? T[K]: T[K] extends Method<TS, R>: NumberedMethod<TS, R>: never;
};

有什么可行的方法吗?

1 个答案:

答案 0 :(得分:1)

如果您尝试从方法中提取通用参数TSR,则需要在条件类型的类型名称之前使用infer关键字(请参见{{ 3}})。这应该做您想要的:

interface Method<TS extends any[], R> { 
  (...args: TS): R;
}
interface NumberedMethod<TS extends any[], R> { 
  (n: number, ...args: TS): R;
}


type Numbered<T> = {
    [K in keyof T]: T[K] extends Method<infer TS, infer R>? NumberedMethod<TS, R>: T[K];
};

type WithNumber = Numbered<{
    foo : number,
    bar(a: string): void
}> 
// same as 
// type WithNumber = {
//   foo: never;
//   bar: NumberedMethod<[string], void>; // This gets expanded by code completion when accessing the method usually 
// }