microsoft / microsoft/TypeScript
Type narrowing discards template type on this-typed return value
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Go
- Estrellas
- 111k
- Forks
- 14.4k
- Merge medio
- 1 d 19 h
- PR fusionados (30 d)
- 117
Descripción
Bug Report
🔎 Search Terms
type narrowing template constraint
🕗 Version & Regression Information
Bug occurs in every version on the playground
⏯ Playground Link
Playground link with relevant code
💻 Code
abstract class Foo {
abstract clone(): this;
}
function cloneMe<T extends Foo|Date>(x: T): T {
if (x instanceof Foo) return x.clone();
// These casts are necessary because of https://github.com/microsoft/TypeScript/issues/38309.
return new Date(x as Date) as T;
}
🙁 Actual behavior
Type 'Foo & Foo' is not assignable to type 'T'. 'Foo & Foo' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Foo | Date'.
🙂 Expected behavior
No errors; just like the instanceof check narrows x to Foo & T, the this return type of x.clone() should also be Foo & T rather than degrading to Foo & Foo.
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 con el ejemplo enlazado de TypeScript Playground e inspecciona el estrechamiento de tipos y el comportamiento de retorno this polimórfico involucrados en cloneMe. El issue estará terminado cuando se conserve el retorno de x.clone() como Foo & T y el ejemplo compruebe los tipos sin casts ni errores.
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
- Bien especificado
- Aptitud para principiantes
- 35/100