-
Notifications
You must be signed in to change notification settings - Fork 1
/
this-type.ts
30 lines (25 loc) · 1.12 KB
/
this-type.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type DescritorDeObjeto<D, M> = {
dado?: D;
metodos?: M & ThisType<D & M>; // Tipo de this em metodos é D & M
};
function fazObjeto<D, M>(desc: DescritorDeObjeto<D, M>): D & M {
let dado: object = desc.dado || {};
let metodos: object = desc.metodos || {};
return { ...dado, ...metodos } as D & M;
}
let obj = fazObjeto({
dado: { x: 0, y: 0 },
metodos: {
moveBy(dx: number, dy: number) {
this.x += dx; // this fortemente tipado
this.y += dy; // this fortemente tipado
},
},
});
obj.x = 10;
obj.y = 20;
obj.moveBy(5, 5);
/**
* No exemplo acima, o objeto metodos no argumento para fazObjeto tem um tipo contextual que inclui EsseTipo<D & M> portanto o tipo de this em metodos dentro do objeto metodos é { x: number, y: number } & { movePor(dx: number, dy: number): number }. Perceba como o tipo da propriedade metodos é simultaneamente uma interface alvo e a fonte para o tipo this nos metodos.
O marcador interface EsseTipo<T> é simplesmente uma interface vazia declarada em lib.d.ts. Além de ser reconhecida no tipo contextual de um objeto literal, a interface age como qualquer interface vazia.
*/