microsoft / microsoft/TypeScript
Object literals should have a `this` type too
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.7.0-dev.20190831
Search Terms: this return type object composing composition
Code
I tried writing some self-contained parts of objects as a kind of multiple-inheritance or object composition, which I would combine later, and ran into this case.
const a = {
Clone() {
return this;
},
x: 1,
};
const b = {
Clone: a.Clone,
y: 2,
};
console.log(b.Clone().x); // number, bad! Should be an error!
console.log(b.Clone().y); // compiler error, bad! This should be acceptable!
Expected behavior: this, the return type of Clone, should evaluate to typeof b in b.Clone()
Actual behavior: It evaluates to typeof a, since it was defined in a
This can be circumvented by defining this as a type parameter like so:
const a = {
Clone<T>(this: T) {
return this;
},
x: 1,
}
const b = {
Clone: a.Clone,
y: 2
};
console.log(b.Clone().x); // compiler error, good!
console.log(b.Clone().y); // works! Also good!
Another interesting problem at play here though, is that using a type parameter for this also means that TS doesn't know what could be inside of this. This means you have to manually specify whatever members you hope to have access to. It would be nice if you could do T extends typeof a and it would automatically drop all the members of a in there. Right now, it will error if you do this:
'a' implicitly has type 'any' because it does not have a type annotation and is referenced directly or indirectly in its own initializer.ts(7022)
I think all methods like this should, therefore, be implicitly equivalent to the following:
const a = {
Clone<T extends typeof a>(this: T) {
console.log(this.x); // should work
return this;
},
x: 1,
}
Then, b.Clone() would error since b is not a superset of a. Unless you did c = Object.assign({}, a, b), and did c.Clone()
Related Issues: https://github.com/microsoft/TypeScript/issues/29122
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 y compara el tipo de retorno inferido de Clone cuando se copia de a a b. Lee el issue relacionado #29122 para obtener contexto sobre este comportamiento. Se considera completado determinar e implementar si los métodos de los literales de objeto deberían inferir this a partir del uso de su objeto contenedor, preservando al mismo tiempo el acceso válido a los miembros del objeto original.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- typescript
- Área
- compilers
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 30/100