在TypeScript中对映射的条件类型使用泛型

在TypeScript中对映射的条件类型使用泛型,typescript,Typescript,为了映射方法类型,可以将泛型与映射类型一起使用吗 例如:是否可以创建一个映射类型,在其中向每个方法添加类型为number的第一个参数 伪代码(不起作用) 接口方法{ (…args:TS):R; } 接口编号方法{ (n:number,…args:TS):R; } 类型编号={ //错误!这里不能使用泛型?? [K in keyof T]:T[K]扩展NumberedMethod?T[K]:T[K]扩展Method:NumberedMethod:never; }; 有什么方法可以做到这一点吗?如

为了映射方法类型,可以将泛型与映射类型一起使用吗

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

伪代码(不起作用)

接口方法{
(…args:TS):R;
}
接口编号方法{
(n:number,…args:TS):R;
}
类型编号={
//错误!这里不能使用泛型??
[K in keyof T]:T[K]扩展NumberedMethod?T[K]:T[K]扩展Method:NumberedMethod:never;
};

有什么方法可以做到这一点吗?

如果您试图从方法中提取泛型参数
TS
R
,则需要在条件类型中的类型名称之前使用
推断
关键字(请参阅)。这应该满足您的要求:

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 
// }
接口方法{
(…args:TS):R;
}
接口编号方法{
(n:number,…args:TS):R;
}
类型编号={
[K in keyof T]:T[K]扩展方法?NumberedMethod:T[K];
};
键入WithNumber=已编号
//同
//类型WithNumber={
//傅:从来没有;
//bar:NumberedMethod;//通常在访问该方法时,它会通过代码完成来扩展
// }

Wow。条件类型变得更强大了!谢谢你的快速回答。@nicojs它从一开始就存在,只是它是与vanilla条件类型不同的一个功能,但是是的
infere
是令人兴奋的:)在你的“same as”评论中,你是指
foo:number
而不是
foo:never
?(试着让我明白你的黑带式柔术总是一种很好的锻炼!)
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 
// }