Búsqueda de sitios web

typescript - Cambiar el tipo de contexto de "this" en cada método de la interfaz


type Context = {anyContext: any};

interface Test {
   method1: (this: Context, a: number, b: number) => void;
   method2: (this: Context, x: string, y: string) => void;
}

Actualmente he escrito esta interfaz arriba, pero me gustaría hacer algo como esto:

interface TestBase {
   method1: (a: number, b: number) => void;
   method2: (x: string, y: string) => void;
}

type Test2 = ChangeContextInEveryMethod<TestBase, Context>;

así que los tipos Test y Test2 son iguales.

Básicamente necesito cambiar el tipo this en cada método de una interface específica

Respuesta #1

Puedes crear un tipo mapeado donde infieras los argumentos y el tipo de retorno de cada propiedad de tipo función y luego producir un nuevo tipo de este tipo con el parámetro this configurado al tipo deseado:

type ChangeContextInEveryMethod<T extends object, Th> = {
  [K in keyof T]: T[K] extends (...args: infer A) => infer R ? 
    (this: Th, ...args: A) => R : 
    T[K]
}

type Test2 = ChangeContextInEveryMethod<TestBase, Context>;
/* type Test2 = {
    method1: (this: Context, a: number, b: number) => void;
    method2: (this: Context, x: string, y: string) => void;
} */

Esto funciona para tu ejemplo. Ciertamente hay casos límite; por ejemplo, si tus métodos son genéricos, el método del tipo mapeado no será genérico. Así que asegúrate de que tus casos de uso estén soportados.

Enlace de Playground al código

Artículos relacionados