是否可以将具有泛型的泛型用于映射方法类型?
例如:您可以创建一个映射类型,在其中向每个方法添加类型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;
};
有什么可行的方法吗?
答案 0 :(得分:1)
如果您尝试从方法中提取通用参数TS
和R
,则需要在条件类型的类型名称之前使用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
// }