microsoft / microsoft/TypeScript
Overload gets lost in mapped type with conditional type
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.3k
- Merge medio
- 2 d 4 h
- PR fusionados (30 d)
- 132
Descripción
TypeScript Version: 3.4.0-dev.201xxxxx
Search Terms: mapped type overload
Code
interface Overloads {
foo(a: string): void;
foo(a: number, b: string): void;
}
/** Converts all properties of an object to Promises and all methods to return Promises */
type ProxiedObject<T> = {
[P in keyof T]: T[P] extends (...args: infer Arguments) => infer R
? (...args: Arguments) => Promise<R>
: Promise<T[P]>
};
declare let x: ProxiedObject<Overloads>;
x.foo("abc"); // Error: [ts] Expected 2 arguments, but got 1. [2554]
x.foo(123, "abc");
Expected behavior:
No error, overload should be maintained.
This makes it impossible to use this pattern with popular types that contain overloads, like Rx Observable pipe()/subscribe().
The ProxiedObject type is used in https://github.com/GoogleChromeLabs/comlink.
Actual behavior:
Overload gets lost, compile error when trying to call the first overload.
Playground Link: link
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza reproduciendo el comportamiento de overload de los mapped types en el TypeScript Playground enlazado usando el ejemplo proporcionado de Overloads y ProxiedObject. Sigue el procesamiento del compilador de los conditional y mapped types y, después, añade una prueba de regresión para ambas llamadas a overloads; se considera terminado cuando ninguna de las dos llamadas produce un error y se conserva el comportamiento de los overloads.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Error
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 35/100