microsoft / microsoft/TypeScript
Represent the types of function parameters that mutate inside the function.
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
In JavaScript is possible to mutate objects inside functions. Right now, the following code in JavaScript:
function merge(x,y) {
Object.assign(x,y);
}
let x = {a: 1};
merge(x, {b: 2});
console.log(x.b);
Can't be written in TypeScript without casting the type. There are a few options whose type definition is wrong in all scenarios I can think of (maybe I'm missing a better option):
Option 1
let x: {a: number, b: number} = {a: 1}; // Error, missing b
merge(x, {b: 2});
Option 2
let x: {a: number, b: number} = {a: 1, b: 2};
merge(x, {b: null});
// From here, x.b is not a number anymore, but you could do
let y: number= x.b;
Suggestion
There could be an extension to function parameter definition like the following:
// then keyword indicates that before it can be type A, and after it will be of type A&B.
function merge<A,B>(x: A then x2: A&B, y: B) {
Object.assign(x2,y);
}
let x: {a: number, b: number} = {a: 1, b: 2};
merge(x, {b: null});
// Here, type of x is {a: number, b: number} & {b: null}
x.b; // Type null
There, we indicate that whatever type was x before, now it is something different. The code above could be written in TypeScript as follows:
// then keyword indicates that before it can be type A, and after it will be of type A&B.
function merge<A,B>(x: A, y: B) {
Object.assign(x,y);
}
let x: {a: number, b: number} = {a: 1, b: 2};
merge(x, {b: null});
// Here, type of x is {a: number, b: number} & {b: null}
let xAfterMerge = x as {a: number, b: number} & {b: null};
// Since this line, x should not be used but xAfterMerge
xAfterMerge.b; // Type null
Another example
interface Before {
address: string;
}
interface After {
addr: string;
}
function map(userb: Before then usera: After) {
usera.addr = userb.address;
delete userb.address;
}
let u = {adress: "my street"};
map(u);
console.log(u.addr);
That could be syntax sugar for this:
interface Before {
address: string;
}
interface After {
addr: string;
}
function map(userb: any) {
userb.addr = userb.address;
delete userb.address;
}
let u = {adress: "my street"};
map(u);
console.log((u as After).addr);
Syntax
It could be something like:
identifier: type *then* identifier: type
With the identifiers being different, and with the types being mandatory an extension of Object.
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 revisando los ejemplos propuestos de merge y map, incluida la sintaxis sugerida del parámetro then y el comportamiento de los tipos antes y después. Determina si la propuesta tiene una semántica definida para la mutación, los alias, la eliminación de propiedades y la nulabilidad; se consideraría terminado cuando exista un diseño acordado lo bastante preciso como para guiar la implementación y las pruebas.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- javascript, 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
- 25/100