rxjs5 - typescript detta som parameter


När jag tittade igenom rxjs-biblioteket snubblade jag över den här funktionen:

export function map<T, R>(this: Observable<T>, project: (value: T, index: number) => R, thisArg?: any): Observable<R> {
   if (typeof project !== 'function') {
     throw new TypeError('argument is not a function. Are you looking for `mapTo()`?');
   }
   return this.lift(new MapOperator(project, thisArg));
}

källa: https://github.com/ReactiveX/rxjs/blob/master/src/operator/map.ts

Jag undrar vad som egentligen händer när man skickar ett argument som heter this. Behandlas det bara som vilken annan parameter som helst eller gör TypeScript något speciellt när man gör detta?

Svar #1

Du kan inte direkt skicka map ett argument som motsvarar this-parametern i signaturen. this-parametern används av TypeScript för att ange typen för kontexten och det finns inget motsvarande argument vid körning.

Men map-funktionen kan anropas med Function.prototype.call eller Function.prototype.apply, och kontexten kan skickas till call eller apply.

Till exempel:

import { of } from "rxjs/observable/of";
import { map } from "rxjs/operator/map";

const source = of(1);
const mapped = map.call(source, value => value + 1);

I det här exemplet skulle source motsvara this i implementationen av map, och det skulle ha typen Observable<number>.

För mer information, se avsnittet "this parametern" i dokumentationen.

Relaterade artiklar