在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
// }